Автозапуск демона

SergJP

New member
Сообщения
4
#1
Коллеги, добрый день!
Возникла проблема, никак не удается запустить программу при загрузке системы. Пробовал и через system.d и через init.d
Скрипты прилагаю

файл pg_agent.service лежит в /etc/systemd/system
Код:
[Unit]
  Description=Lira database frequent tasks service

[Service]
  Type=forking
  ExecStart=/home/user0/pgagent/pg_agent
  User=user0
  Group=root
  Environment=LD_LIBRARY_PATH=/home/user0/pgagent/lib



[Install]
  WantedBy=multiuser.target
и файл pg_agent.sh лежит в /etc/init.d с правами выполнения
Код:
!/bin/bash
#
### BEGIN INIT INFO
# Provides:          pg_agent
# Required-Start:    $all
# Required-Stop:     $all
# Should-Start:      $all
# Should-Stop:       $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Lira database frequent tasks service
# Description:       Lira database frequent tasks service
### END INIT INFO

export LD_LIBRARY_PATH=/home/user0/pgagent/lib

service_name="pg_agent"
DAEMON="/home/user0/pgagent/pg_agent"
PIDFILE=/var/run/pg_agent.pid

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

start() {
log_daemon_msg "Starting pg_agent..."
start_daemon -p $PIDFILE $DAEMON
log_end_msg $?
}
stop() {
log_daemon_msg "Stopping pg_agent..."
killproc -p $PIDFILE $DAEMON
log_end_msg $?
}
status() {
if (( $(ps -ef | grep -v grep | grep $service_name | wc -l) > 0 )); then
     echo "$service_name is running!!!"
else
     echo "$service_name is down!!!"
fi
}
case $1 in
  start|stop|status) $1;;
  restart) stop; start;;
  *) echo "Usage : $0 <start|stop|restart>"; exit 1;;
esac

exit 0
Команду update-rc.d pg_agent.sh выполнил, сработала молча.
При загрузке программа не стартует, journalctl ничего про нее не показывает. Такое впечатление, что Астра ее и не собиралась запускать.
Что-то я не доделал?
Система Астра Орел 2.12.39
 

oko

New member
Сообщения
1 257
#2
to SergJP
Primo, если скрипт называется pg_agent.sh, то у вас неверно указано имя скрипта в ExecStart...
Secundo, почитайте про:
  • очередность запуска (After= и Before=) - если ваш скрипт не просто выдает сообщение о своем старте/останове, а имеет зависимости от других сервисов - это вам точно понадобится;
  • опцию RemainAfterExit=True, которая настоятельно рекомендуется для условно регулируемых сервисов;
  • необходимость и достаточность systemctl enable имя-сервиса && systemctl daemon-reload (reload также при внесении изменений в Unit зачастую требуется) - никаких update-rc и никаких размещений в /etc/init.d (впрочем, поскольку Debian оставил обратную совместимость с SysVInit, так тоже можно, но... сложнее и не нужно)...
Tertio, состояние Type=forking имеет смысл для скрипта, который будет долгое время висеть в памяти отдельным процессом. Для всего остального и утилитарного настоятельно рекомендуется Type=oneshot...
Главное. Можно сделать сервис, запускаемый от лица какого-либо пользователя, через sudo...
[Unit]
Description=Autoloading bla-bla-bla
After=rsyslog.service
[Service]
Type=oneshot
RemainAfterExit=True
ExecStart=/usr/bin/sudo -u user123 /opt/myscript.sh
[Install]
WantedBy=multi-user.target

ЗЫ Знатоки systemd-диалекта могут раскритиковать, но... приведенные выкладки однозначно работают (только что проверил, ага). Да и не люблю я это нестабильное поделие - SysVInit был сложнее в оформлении и логике, зато с куда более гибким управлением оконечными процессами...
 

SergJP

New member
Сообщения
4
#3
to SergJP
Primo, если скрипт называется pg_agent.sh, то у вас неверно указано имя скрипта в ExecStart...
Secundo, почитайте про:
  • очередность запуска (After= и Before=) - если ваш скрипт не просто выдает сообщение о своем старте/останове, а имеет зависимости от других сервисов - это вам точно понадобится;
  • опцию RemainAfterExit=True, которая настоятельно рекомендуется для условно регулируемых сервисов;
  • необходимость и достаточность systemctl enable имя-сервиса && systemctl daemon-reload (reload также при внесении изменений в Unit зачастую требуется) - никаких update-rc и никаких размещений в /etc/init.d (впрочем, поскольку Debian оставил обратную совместимость с SysVInit, так тоже можно, но... сложнее и не нужно)...
Tertio, состояние Type=forking имеет смысл для скрипта, который будет долгое время висеть в памяти отдельным процессом. Для всего остального и утилитарного настоятельно рекомендуется Type=oneshot...
Главное. Можно сделать сервис, запускаемый от лица какого-либо пользователя, через sudo...
[Unit]
Description=Autoloading bla-bla-bla
After=rsyslog.service
[Service]
Type=oneshot
RemainAfterExit=True
ExecStart=/usr/bin/sudo -u user123 /opt/myscript.sh
[Install]
WantedBy=multi-user.target

ЗЫ Знатоки systemd-диалекта могут раскритиковать, но... приведенные выкладки однозначно работают (только что проверил, ага). Да и не люблю я это нестабильное поделие - SysVInit был сложнее в оформлении и логике, зато с куда более гибким управлением оконечными процессами...
если скрипт называется pg_agent.sh, то у вас неверно указано имя скрипта в ExecStart...
В ExecStart указан путь до выполняемого файла, то, что непосредственно должно быть запущено. А шелл-скрипт лежит в init.d
По замыслу программа должна запускаться при загрузке системы и работать постоянно. Поэтому я и поставил forking.
Руками сервис запускается. Проблема в том, то он не запускается автоматически после перезагрузки.

root@astra-meteo:/home/user0/Загрузки# systemctl status pg_agent.service
● pg_agent.service - Lira database frequent tasks service
Loaded: loaded (/etc/systemd/system/pg_agent.service; enabled; vendor preset: enabled)
Active: inactive (dead)
root@astra-meteo:/home/user0/Загрузки#
 

oko

New member
Сообщения
1 257
#4
to SergJP
Писал вам ответ и наконец понял идею. Но, епть, кто ж вас так учил информацию подавать?..
Очевидно, вам нужно при загрузке системы запустить некий pg_agent-сервис в окружении user0, а приведенный bash-скрипт - это вообще левая функция произвольного управления (запуск, останов, проверка статуса) для данного сервиса pg_agent, которая к сути вопроса вообще отношения не имеет (потому что у вас не стартует именно Unit, а не bash-скрипт)?
Если так, то:
  • забудьте про /etc/init.d - для упрощения доступа разместите pg_agent.sh хоть в /usr/bin (либо пропишите для пользователя, который потом будет использовать данный скрипт управления, путь к нему через переменные окружения);
  • исправьте код своего Unit на аналогичный моему (см. спойлер в прошлом сообщении), заменив oneshot на forking, добавив Environment=LD_LIBRARY_PATH=/home/user0/pgagent/lib и указав путь ExecStart=/usr/bin/sudo -u user0 /home/user0/pgagent/pg_agent;
  • выполните systemctl enable pg_agent.service && systemctl daemon-reload.
Если user0 не упрется в какие-либо права доступа и проч., сервис будет стартовать при загрузке системы. Повторюсь, неплохо бы выверить опции After и Before при написании Unit, чтобы ваш pg_agent не запустился раньше времени и зависимостей...

ЗЫ Для полноты проверки напишите короткий bash-скрипт, первой строкой которого будет отправка сообщения в лог (echo "bla-bla-bla" | logger), а второй - /home/user0/pgagent/pg_agent. Укажите его полный путь в ExecStart вашего Unit. Таким образом сможете проверить по syslog, правильно ли отрабатывает Unit...
 

SergJP

New member
Сообщения
4
#5
Спасибо большое за совет! (y) Я действительно забыл про systemctl enable Все заработало, pg_agent грузится при старте. Я действительно плохо описал задачу, приношу извинения.
Еще раз спасибо!
 

welder800

New member
Сообщения
8
#6
Доброго дня Коллеги, мучаюсь с автозагрузкой скрипта. Прошу помощи. Нашел тут инфо, но не помогло.
Создал фаил tmif.service положил сюда /etc/systemd/system.
Дал права на запуск везде, сервис не стартует.
[Unit]
Description=Autoloading tmif.service
After=rsyslog.service
[Service]
Type=forking
RemainAfterExit=True
ExecStart=/usr/bin/sudo -u user /etc/init.d/ tmif.sh
[Install]
WantedBy=multi-user.target

Он вроде стартовал но в процеесах не виден.
Запуск скрипта такой /etc/init.d/ tmif.sh start
Задача: любыми способами запустить скрипт от рута (от юзера он не запускается) после перезагрузки. Астра 1.7.5 Орел. Настроен автологин. Скрипт должен стартовать и висеть в процессах. Любое решение, которое поможет.
Копирование rc2.d результат не дало. Сим линк тоже создавался так ln -s /etc/init.d/ tmif.sh S90tmif.sh результат зеро.
 

Olej

New member
Сообщения
1 307
#7
Не прошло и 4 года, как Зоркий Сокол заметил... :eek:
Создал фаил tmif.service положил сюда /etc/systemd/system.
Запуск скрипта такой /etc/init.d/ tmif.sh start
Вы всё впутали в кучу, старый и новый способ запуска сервисов, служб в Linux, под управлением systemd, и без systemd - init...
systemd десять лет спустя. Историческая и техническая ретроспектива
Нет... ну нет такой Астра 1.7.5 Орел, CE, Common Edition :unsure:
Скрипт должен стартовать и висеть в процессах.
Скрипт стартует, и не "висит" ... он может запускать кукую-то циклическую службу ... или даже сам циклиться (но это уже какое-то извращений)...
Скрипт запускается + выполняется + завершается.
 

Montfer

New member
Сообщения
2 364
#8
astra linux 1.7.5 в режиме защищенности базовый (или орел)
 

welder800

New member
Сообщения
8
#9
Уменя заработало так…
Работаем от рута в терминале sudo -i
root@astra
использовать редактор nano /etc/init.d/program.sh
или mc
скопировать winscp в папку /tmp/program.service
Положить фаил program.service в папку /etc/systemd/system
cp /tmp/program.service /etc/systemd/system/
Проверить права должны быть ls -la root:root
ls -la
Если нет изменить chown – v root:root program .service
Этот файл, конечно же, должен быть исполняемым: chmod a+x /etc/systemd/system/ program.service как и program.sh
(root@astra:/etc/systemd/system# chown -v root:root program.service
владелец 'program.service' оставлен как root:root)
root@astra:/etc/init.d/program.sh так же проверить права и если надо изменить chown – v root:root program.sh
Во всех каталогах, где программа, проверить права доступа. Должны быть root:root (необязательно но возможно)

program.sh в фаиле поправить заголовок
#!/bin/bash
#chkconfig: 345 99 00 (не факт)
#description: Service description (не факт)
systemctl enable program.service Активировать сервис
reboot
systemctl status program.service Проверить автостарт.
Вывод должен быть такой. Запуск сервиса с командой вашей проги
Проверка статуса
https://www.digitalocean.com/commun...emctl-to-manage-systemd-services-and-units-ru
/etc/systemd/system/
[Unit]
Wants=network-online.target
After=network-online.target
Description=Autoloading proga.service
After=rsyslog.service
[Service]
Type=oneshot
RemainAfterExit=True
ExecStart=/etc/init.d/proga.sh start
[Install]
WantedBy=multi-user.target
 

oko

New member
Сообщения
1 257
#10
to welder800
Не надо от root, даже при "базовой защищенности". Через sudo все команды под юзером, указанном при установке ОС (или входящем в группу astra-admin), не более...
После создания systemd-Unit, systemctl enable имя_юнита для активации, а также systemctl daemon-reload для правки цепочки запуска Unit'ов...
Если Unit должен висеть в памяти и порождать самостоятельный дочерний процесс, то Type=forking. Если нужен для разового запуска чего-либо (с подменой себя на запускаемый процесс), то Type=oneshot. Несколько записей After= лучше не делать - как максимум, через пробел в одном After= через пробел указать несколько других Unit, после которых должен стартовать целевой Unit...
Имя и группу пользователя, от которого будет выполняться целевое (заданное в ExecStart=) можно задать в том же Unit в секции [Service] через User= и Group=...
Если bash/sh-скрипт самопальный, то его лучше перенести куда-нибудь в /opt/уникальный_каталог/имя_скрипта и запускать оттуда через ExecStart. Потому что ради совместимости в Debian-подобных дистрибутивах оставлено классическое /etc/init.d, которое также может использоваться для автозапуска служб (яркий пример, сервис синхронизации времени ntpd)...
Вообще, там еще вагон и маленькая тележка довольно гибких опций. Минус systemd-подхода только в одном: система сама решает, в каком порядке запускать "однотипно зависимые Unit" и какую временную разбежку между ними давать. Что не всегда подходит для жестких канонически выверенных действий...

to Olej
Вот что тебе каждый раз мешает вменяемо и подробно ответить, а не обвинять людей черте в чем?