У меня есть следующий код systemd ниже.

[Unit]
Description=start RCC logger server process
Requires=rcc-drbd.service rcc_check_locked_scr.service s96rcc.service
After=rcc-drbd.service rcc_check_locked_scr.service s96rcc.service

[Service]
ExecStart= exec /var/RCC/RCClogger.sh
Restart=no

[Install]
WantedBy=multi-user.target

где я пытаюсь запустить его, я получаю ошибку ниже.

Mar 23 04:45:52 localhost.localdomain systemd[1]: 
[/etc/systemd/system/rcc_logger.service:7] Executable path is not absolute, 
ignoring: exec /v...ogger.sh
Mar 23 04:45:52 localhost.localdomain systemd[1]: rcc_logger.service lacks 
both ExecStart= and ExecStop= setting. Refusing.

Я знаю, что это из-за отсутствия абсолютного пути к команде exec, но так как exec недоступен как двоичный файл, я не могу использовать для него абсолютный путь. Как заставить этот ExecStart работать?

2 ответа2

2

Вы не можете использовать exec в конфигурации системного блока обслуживания.
exec является встроенной оболочкой и не может быть вызван напрямую из файловой системы (она не находится в файловой системе) - type exec и whereis exec покажет вам это.
Используйте оболочку, в которой они написаны.

Например, если это скрипт bash , вы можете запустить скрипт так:

bash /var/RCC/RCClogger.sh

Теперь bash является исполняемым файлом и имеет абсолютный путь: /bin/bash . Ваш ExecStart будет выглядеть следующим образом:

ExecStart=/bin/bash /var/RCC/RCClogger.sh

Другой способ - просто добавить shebang в начало скрипта:

#!/bin/bash
... script code ...

Это говорит операционной системе запустить файл с указанным интерпретатором, в данном случае /bin/bash .

После этого просто сделайте ваш скрипт исполняемым:

chmod +x /var/RCC/RCClogger.sh

И использовать его непосредственно как ExecStart:

ExecStart=/var/RCC/RCClogger.sh
0

«EXecStart =» нужен абсолютный путь для запуска службы. Получите полный путь к вашему файлу .sh и добавьте его в оператор ExecStart.

Снова "manpage" даст вам подробную информацию.

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