Системная ошибка: путь к исполняемому файлу не является абсолютным
У меня есть следующий код 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 ответа
Вы не можете использовать exec в конфигурации единицы обслуживания systemd. 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
"EXecStart=" нужен абсолютный путь для запуска службы. Получите полный путь к вашему файлу.sh и добавьте его в оператор ExecStart.
Снова "manpage" даст вам подробную информацию.