8

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

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

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

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

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

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

2 ответа2

7

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

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

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

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

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

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

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

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .