Как записать сценарий запуска для systemd

Наиболее распространенная причина, почему сценарий работает из командной строки, но не из crontab, состоит в том, что сценарий зависит от переменной среды. Crontabs только имеют несколько наборов переменных среды: обычно только HOME, USER, SHELL (набор к /bin/sh) и PATH (набор к системному значению по умолчанию). При необходимости в больше необходимо определить их в crontab файле или источнике ~/.profile от команды.

Возможно, у Вас есть две версии установленного PHP, тот, который на первом месте в Вашей командной строке $PATH и тот, который на первом месте в Вашем системном значении по умолчанию $PATH, и системное значение по умолчанию PHP, измененный недавно. Но невозможно высказать больше, чем образованное предположение, так как Вы не говорите, какую ошибку Вы получаете.

234
09.03.2017, 10:10
1 ответ

Существует главным образом два подхода, чтобы сделать это:

  • Если необходимо запустить скрипт, Вы не преобразовываете его, а скорее запускаете скрипт через a systemd сервис.

Поэтому Вам нужны два файла: сценарий и .service файл (конфигурационный файл единицы).
Удостоверьтесь, что Ваш сценарий является исполняемым файлом, и первая строка (хижина) #!/bin/sh. Затем создайте .service файл в /etc/systemd/system (файл простого текста, давайте назовем его vgaoff.service).
Например:

  1. сценарий: /usr/bin/vgaoff
  2. файл единицы: /etc/systemd/system/vgaoff.service

Теперь, отредактируйте файл единицы. Его содержание зависит от того, как Ваш сценарий работает:

Если vgaoff просто выключает gpu, например:

exec blah-blah pwrOFF etc 

затем содержание vgaoff.service должен быть:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff

[Install]
WantedBy=multi-user.target

Если vgaoff используется, чтобы выключить GPU и также привести в действие его назад на, например:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

case $1 in
  start|stop) "$1" ;;
esac

затем содержание vgaoff.service должен быть:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff start
ExecStop=/usr/bin/vgaoff stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • Для большинства тривиальных случаев можно обойтись без сценария и выполнить определенную команду непосредственно:

Выключаться:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"

[Install]
WantedBy=multi-user.target

Выключаться и на:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
ExecStop=/bin/sh -c "echo ON > /whatever/vga_pwr_gadget/switch"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

После того как Вы сделаны с файлами, включаете сервис:

systemctl enable vgaoff.service

Это запустится автоматически на следующей начальной загрузке. Вы могли даже включить и запустить сервис сразу с

systemctl enable --now vgaoff.service

с systemd v.220 (на более старых установках необходимо будет запустить его вручную).
Для получения дополнительной информации посмотрите systemd.service страница руководства.


Поиск и устранение неисправностей.
Запустите здесь:
Как видеть полный журнал a systemd сервис?
systemd сервисные коды выхода и объяснение информации о статусе

337
27.01.2020, 19:28
  • 1
    Спасибо за подробный ответ. Сценарий содержит одну команду "эхо ПРОЧЬ>/sys/kernel/debug/vgaswitcheroo/switch", –  Sharique 11.09.2012, 13:04
  • 2
    это перестало работать со следующим сообщением vgaoff.service - Выключение питания gpu Загруженный: загруженный (/usr/lib/systemd/system/vgaoff.service; включенный) Активный: отказавший (Результат: код выхода) со вторника, 11 сентября 2012 23:46:46 +0530; несколько 30-х назад Процесс: 5 258 ExecStart =/usr/lib/systemd/scripts/vgaoff (code=exited, status=203/EXEC) CGroup: name=systemd:/system/vgaoff.service –  Sharique 11.09.2012, 21:17
  • 3
    ой, не снова, я пропустил эту мелочь, он хорошо работает.. еще раз спасибо. –  Sharique 12.09.2012, 21:58
  • 4
    @Bazon - согласно этой логике, тысячи ответов на этом сайте являются "потенциальными прерываниями" для неопытных пользователей. Люди, которые не знают / полностью, понимают что echo SOMETHING > /some/file делает (или любая другая команда, на самом деле) должен познакомиться с основами CLI прежде, чем попытаться выполнить материал в их системах. То, что в стороне, к вашему сведению, чтение, как выключить dGPU на нескольких моделях ноутбука, посмотри, могли ли команды, используемые там, быть заменены чем-то как Вы, предлагают. Кроме того, для восстановления исходного файла, Вы обычно переустанавливаете пакет, который владеет им. –  don_crissti 15.05.2013, 02:56
  • 5
    @don_crissti! спасибо за подсказку. (удаленный мой исходный комментарий для предотвращения распространения вводящей в заблуждение информации.) –  Woodrow Barlow 14.11.2016, 23:39

Теги

Похожие вопросы