Проблема: я хочу, чтобы сценарий оболочки запускался из среды входа другого пользователя при загрузке. Вот мой файл .service:
[Unit]
Description=Weather Application Server
[Service]
Type=oneshot
User=weather
RemainAfterExit=yes
ExecStart=/usr/local/weather/startfeed
ExecStop=/usr/local/weather/stopfeed
[Install]
WantedBy=multi-user.target
Это работает из командной строки (т.е. набрав systemctl start / stop weatherService). Однако ... когда я перезагружаю машину, я получаю следующую ошибку через journalctl -se:
-- Subject: Unit weatherServer.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit weatherServer.service has begun starting up.
Jan 10 19:21:48 localhost.local.local systemd[1]: Started D-Bus System Message Bus.
Jan 10 19:21:48 localhost.local.local systemd[784]: Failed at step USER spawning /usr/local/weather/startfeed: No such file or directory
-- Subject: Process /usr/local/weather/startfeed could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
Я новичок в системе, но я искал везде. Почему я могу запустить это из командной строки через 'systemctl start / stop' и регулярно из командной строки, но не из загрузки?
ФИКСИРОВАННЫЙ !!!!
РЕШЕНИЕ БЫЛО ...
Конфигурация "Unit file" в моем исходном сообщении верна. Система, в которой это работает, использует процесс, похожий на ActiveDirectory, который не был полностью запущен, когда он был запущен. Решение, которое сработало для нас, заключалось в добавлении «таймера» (т.е. файла .timer). Приведенный ниже файл weatherServer.timer - это то, что у нас сработало:
[Unit]
Description=Weather Application Server Timer
[Timer]
OnBootSec=30
[Install]
WantedBy=multi-user.target
Надеюсь, это поможет тому, кто также сталкивается с этой проблемой.
Похоже, ваш скрипт пытается запустить до того, как будет смонтирована файловая система, содержащая / usr / local / weather. Что вы хотите сделать, так это поставить одну или две зависимости, чтобы указать systemd подождать, пока файловая система не будет смонтирована, перед запуском. Это можно сделать, добавив After=
линия в [Unit]
раздел вашего юнита. Например:
[Unit]
Description=Weather Application Server
After=network.target local-fs.target
После внесения изменений вам нужно будет запустить systemctl daemon-reload
, или вы можете просто перезагрузиться, чтобы посмотреть, решит ли это вашу проблему.