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 повідомляє мені, що сценарій запустився та завершився успішно. Все-таки сценарій не має ефекту. Якщо я запускаю скрипт із оболонки, він працює чудово.

Хтось із вас знає, що може бути моєю проблемою?


3
Мабуть, якщо ваш сценарій запускається щось інше, йому потрібен "Type = forking", я відчуваю себе трохи дурним за те, що раніше не псуюся з налаштуваннями.
TokyoMEWS

1
+1 для її вирішення. Будь ласка, опублікуйте своє рішення як відповідь та прийміть його, щоб допомогти іншим людям із тією ж проблемою.
тердон

1
@TokyoMEWS: Точніше, якщо сценарій запускається щось інше і закінчується під час запуску його дітей, йому потрібно "Тип = форкінг".
користувач1686

Відповіді:


7

Окрім того, що TokyoMEWS знайшли самі ...

Мабуть, якщо ваш сценарій запускається щось інше, йому потрібно "Type = forking"

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

... інші можливі проблеми:

  1. Я здогадуюсь, що під "відображенням на екрані" ви мали на увазі, що сценарій просто пише щось для stdout. Це не виходить на екран під час завантаження - скоріше, все з викладеного сервісу відправляється в журнал (або в syslog залежно від вашої версії 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.