У меня есть 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 нашли сами по себе ...
(что не совсем правильно -
Type=forking
становится необходимым только в том случае, если ваш сценарий завершается во время работы его дочерних элементов )... другие возможные проблемы:
Я предполагаю, что под «отображением на экране» вы подразумевали, что скрипт просто что-то пишет в стандартный вывод. Это не выводится на экран во время загрузки - скорее всего, все из стандартного вывода службы отправляется в журнал (или в системный журнал в зависимости от вашей версии systemd).
Если же на самом деле попытка записи на экране (например , с помощью
echo Hi >/dev/tty1
), то очень вероятно , что выход скрипта исчезает , когда agetty очищает экран перед показом входа подсказкам. (Чтобы избежать этого, вам придется заказать устройствоAfter=getty@tty1.service
).Чтобы что-то записать в файл, вам нужно смонтировать файловую систему для чтения-записи. Для этого,
After=local-fs.target
возможно, потребуется, в противном случае устройство может быть запущено слишком рано. Но это зависит от конкретной конфигурации ОС.источник
Если сценарий определяет ExecStop положение , а также, вам нужно установить « RemainAfterExit = да» , чтобы избежать ExecStop вызывается автоматически после ExecStart . Это позволит вашему сервису быть в состоянии « активный » после выполнения команды ExecStart .
источник