Intereting Posts
Как записывать в каталог как часть сценария оболочки и делать число слов в файлах? Путаница в команде cp при создании нового каталога Путайте мой IP-стек Libreoffice Writer, как получить доступную только для чтения часть документа Дата дня следующей недели Посмотрите, сколько памяти было зарезервировано с помощью malloc () процессом в Linux wubi плюсы и минусы .desktop не запускает желаемую программу, несмотря на то, что она идентична синтаксису для рабочего файла Безопасно ли подключать мой USB-накопитель к / home / partimag для клонирования раздела Почему моя Linux не загружается? Обработчик SIGINT работает только один раз Создавать списки номеров страниц для двухсторонней двусторонней печати: 2,3, … и 1,4, … Как я могу сделать общий каталог доступным для SFTP? Ловушка точка (.) Файл не найден ошибок в KSH Считайте и объедините последовательные паттерны

Запуск службы systemd внутри службы systemd вызывает тупик

У меня есть служба systemd (назовем ее first.service ), которая вызывает сценарий bash.

В этом сценарии bash я сначала останавливаюсь, а затем запускаю другую службу с помощью systemctl (например, systemctl start another.service .

Я заметил, что когда я запускаю свой скрипт в оболочке, все работает правильно, а another.service останавливается и позже запускается.

Когда я вызываю systemctl restart first.service systemd останавливает « another.service » правильно, но зависает при запуске.

Когда я проверяю результат ps он говорит, что работают оба вызова systemctl, то есть systemctl restart first.service и systemctl start another.service .

Я использую systemd 230

Это известное поведение? Как я могу это исправить?

Есть ли лучший способ обрабатывать (пере) запуск systemd-сервисов из одной службы?

EDIT : Мой файл first.service :

 [Unit] Description=First service #Before=local-fs.target apache2.service rsyslog.service [Service] Type=oneshot ExecStart=/usr/bin/test.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target 

Мой файл another.service :

 [Unit] Description=Test service [Service] Type=oneshot ExecStart=/bin/bash -c "while ( true ) ; do { date ; echo 'It works!' ; sleep 10 ; } done" RemainAfterExit=yes [Install] WantedBy=multi-user.target 

и мой сценарий bash:

 #!/bin/bash echo stopping systemctl stop another.service echo "result of stop = $?" echo starting systemctl start another.service echo "result of start = $?" echo DONE 

После зависания я получаю следующий вывод из ps :

 [piotr@/etc/systemd/system] $ ps -aux | grep systemctl root 7801 0.0 0.0 27696 1336 pts/21 S+ 16:06 0:00 systemctl restart first root 7807 0.0 0.0 27696 1320 ? S 16:06 0:00 systemctl start another.service piotr 7915 0.0 0.0 15752 968 pts/22 S+ 16:06 0:00 grep --color=auto systemctl 

EDIT2 : я отправляю systemctl status из обеих служб в тот момент, когда в другой консоли я systemctl restart first .

Я также добавил проверку возвращаемого значения в моем сценарии bash. Обновлено выше.

first.service :

 ● first.service - First service Loaded: loaded (/etc/systemd/system/first.service; disabled; vendor preset: enabled) Active: activating (start) since Wed 2017-04-19 16:34:43 CEST; 46s ago Main PID: 12761 (test.sh) CGroup: /system.slice/first.service ├─12761 /bin/bash /usr/bin/test.sh └─12766 systemctl start another.service Apr 19 16:34:43 piotr-ideapad systemd[1]: Starting First service... Apr 19 16:34:43 piotr-ideapad test.sh[12761]: stopping Apr 19 16:34:43 piotr-ideapad test.sh[12761]: result of stop = 0 Apr 19 16:34:43 piotr-ideapad test.sh[12761]: starting 

another.service :

 ● another.service - Test service Loaded: loaded (/etc/systemd/system/another.service; disabled; vendor preset: enabled) Active: activating (start) since Wed 2017-04-19 16:34:43 CEST; 1min 40s ago Main PID: 12767 (bash) CGroup: /system.slice/another.service ├─12767 /bin/bash -c while ( true ) ; do { date ; echo 'It works!' ; sleep 10 ; } done └─13066 sleep 10 Apr 19 16:35:43 piotr-ideapad bash[12767]: Mi 19. Apr 16:35:43 CEST 2017 Apr 19 16:35:43 piotr-ideapad bash[12767]: It works! Apr 19 16:35:53 piotr-ideapad bash[12767]: Mi 19. Apr 16:35:53 CEST 2017 Apr 19 16:35:53 piotr-ideapad bash[12767]: It works! Apr 19 16:36:03 piotr-ideapad bash[12767]: Mi 19. Apr 16:36:03 CEST 2017 Apr 19 16:36:03 piotr-ideapad bash[12767]: It works! Apr 19 16:36:13 piotr-ideapad bash[12767]: Mi 19. Apr 16:36:13 CEST 2017 Apr 19 16:36:13 piotr-ideapad bash[12767]: It works! Apr 19 16:36:23 piotr-ideapad bash[12767]: Mi 19. Apr 16:36:23 CEST 2017 Apr 19 16:36:23 piotr-ideapad bash[12767]: It works! 

EDIT3 : После обмена некоторыми комментариями я попытаюсь перефразировать проблему.

Скажите, что ни один из моих процессов, перечисленных выше, не включен или не запущен. Когда я systemctl status на них – они loaded но inactive .
Затем я вызываю systemctl start first и эта команда терминала не заканчивается.
Если я systemctl status для этих сервисов, я получаю этот статус Active: для обоих из них activating (start) но мое выполнение systemctl start first в терминале, все еще не systemctl start first и оно зависает бесконечно.

Я думаю, что оба этих процесса поставлены в очередь, а systemctl start another в моем сценарии bash, systemctl start first завершится, прежде чем он закончится сам по себе, и здесь мы зашли в тупик.

То, что кажется тупиком, фактически является директивой Type=oneshot работающей как рекламируемая. «Вставить» можно запустить, запустив ваш another.service напрямую:

 systemctl start another 

После отмены можно просмотреть journalctl чтобы найти, что он вообще не «висел», но работает как бесконечный цикл. В man systemd.service мы находим документацию для Type=oneshot :

Поведение одного из них аналогично простому; однако ожидается, что процесс должен выйти до того, как система начинает запускать контрольные единицы.

Другими словами, вы написали бесконечный цикл, а затем проинструктировали systemd подождать, пока он не закончится, прежде чем двигаться дальше.

Вам либо нужно использовать другой Type= , например Type=simple , либо выйти из бесконечного цикла для вашего основного процесса.