Systemd не может запустить скрипт?

5897
TokyoMEWS

У меня есть BASH-скрипт, который я хочу запустить при запуске. Моя система работает под управлением systemd, поэтому я создал файл .service с необходимой информацией:

[Unit] Description=My Script After=network.target  [Service] ExecStart=/home/myscript.sh  [Install] WantedBy=multi-user.target 

Я использовал systemctl enable, чтобы «зарегистрировать» его перезагрузку. При загрузке мне сказали, что мой сценарий будет выполнен, но я не мог видеть ни одно из сообщений, которые ECHO должен отображать на экране, и не записывал что-либо в файл, в соответствии с тем, что я написал в сценарии. Кроме того, он не запускает приложение, которое должен запускаться.

Состояние Systemctl говорит мне, что скрипт успешно запущен и завершился. Тем не менее, сценарий не имеет никакого эффекта. Если я запускаю скрипт из оболочки, он работает отлично.

Кто-нибудь из вас знает, в чем может быть моя проблема?

8
Видимо, если ваш скрипт запускает что-то еще, ему нужно "Type = forking". Я чувствую себя немного глупо, потому что не возился с настройками ранее. TokyoMEWS 11 лет назад 3
+1 за решение. Пожалуйста, опубликуйте свое решение в качестве ответа и примите его, чтобы помочь другим людям с той же проблемой. terdon 11 лет назад 1
@TokyoMEWS: Точнее, если скрипт запускает что-то еще ** и завершает работу **, пока его дочерние элементы работают, ему нужно "Type = forking". grawity 11 лет назад 1

2 ответа на вопрос

7
grawity

В дополнение к тому, что TokyoMEWS нашли сами по себе ...

Видимо, если ваш скрипт запускает что-то еще, ему нужно "Type = forking"

(что не совсем правильно - Type=forkingстановится необходимым только в том случае, если ваш сценарий завершается во время работы его дочерних элементов )

... другие возможные проблемы:

  1. Я предполагаю, что под «отображением на экране» вы подразумевали, что скрипт просто что-то пишет в стандартный вывод. Это не выводится на экран во время загрузки - скорее, все данные из stdout службы отправляются в журнал (или в системный журнал в зависимости от вашей версии systemd).

  2. Если же на самом деле попытка записи на экране (например, с помощью echo Hi >/dev/tty1), то очень вероятно, что выход скрипта исчезает, когда agetty очищает экран перед показом входа подсказкам. (Чтобы избежать этого, вам придется заказать устройство After=getty@tty1.service).

  3. Чтобы что-то записать в файл, вам нужно смонтировать файловую систему для чтения-записи. Для этого, After=local-fs.target возможно, потребуется, в противном случае устройство может быть запущено слишком рано. Но это зависит от конкретной конфигурации ОС.

1
ibai

Если сценарий определяет ExecStop положение, а также, вам нужно установить « RemainAfterExit = да», чтобы избежать ExecStop вызывается автоматически после ExecStart . Это позволит вашей службе быть в состоянии « активный » после выполнения команды ExecStart .

[Service] ExecStart=/home/myscript.sh start ExecStop=/home/myscript.sh stop RemainAfterExit=yes