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

9

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

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

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

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

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

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

Ответы:

7

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

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

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

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

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

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

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

user1686
источник
1

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

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
Ibai
источник