Назад | Перейти на главную страницу

размещение сценария оболочки под управлением systemd

Предполагая, что у меня есть сценарий оболочки, подобный этому: -

#!/bin/sh
# cherrypy_server.sh

PROCESSES=10
THREADS=1 # threads per process
BASE_PORT=3035 # the first port used
# you need to make the PIDFILE dir and insure it has the right permissions
PIDFILE="/var/run/cherrypy/myproject.pid"
WORKDIR=`dirname "$0"`
cd "$WORKDIR"

cp_start_proc()
{
 N=$1
 P=$(( $BASE_PORT + $N - 1 ))
 ./manage.py runcpserver daemonize=1 port=$P pidfile="$PIDFILE-$N" threads=$THREADS request_queue_size=0 verbose=0
}

cp_start()
{
 for N in `seq 1 $PROCESSES`; do
  cp_start_proc $N
 done
}

cp_stop_proc()
{
 N=$1
 #[ -f "$PIDFILE-$N" ] && kill `cat "$PIDFILE-$N"`
 [ -f "$PIDFILE-$N" ] && ./manage.py runcpserver pidfile="$PIDFILE-$N" stop
 rm -f "$PIDFILE-$N"
}

cp_stop()
{
 for N in `seq 1 $PROCESSES`; do
  cp_stop_proc $N
 done
}

cp_restart_proc()
{
 N=$1
 cp_stop_proc $N
 #sleep 1
 cp_start_proc $N
}

cp_restart()
{
 for N in `seq 1 $PROCESSES`; do
  cp_restart_proc $N
 done
}

case "$1" in
 "start")
  cp_start
 ;;
 "stop")
  cp_stop
 ;;
 "restart")
  cp_restart
 ;;
 *)
  "$@"
 ;;
esac

Из сценария bash мы можем сделать 3 вещи:

  1. запустите сервер Cherrypy, вызвав ./cherrypy_server.sh start
  2. остановить сервер Cherrypy, позвонив ./cherrypy_server.sh stop
  3. перезапустите сервер Cherrypy, вызвав ./cherrypy_server.sh restart

Как мне разместить этот сценарий оболочки в systemdконтроль как cherrypy.service файл (с очевидной целью, чтобы systemd запустил сервер cherrypy, когда машина была перезагружена)?

Ссылка systemd пример служебного файла здесь - https://wiki.archlinux.org/index.php/Systemd#Using_service_file

Я использую их для Sick Beard и SabNZBd, двух приложений python / cherrypy. Разница в том, что нужно знать, когда использовать «разветвление». Это в основном сообщает systemd, что основной двоичный файл будет разветвлять материал, поэтому он должен угадывать PID из файла. WantedBy просто определить цель, которая потребует этого для запуска, думайте, что это уровень выполнения. Вы также заметите, что второе определение использует каталог для хранения информации о запуске, потому что оно создает $process-$port для каждого запущенного демона (у вас может быть много демонов, порожденных основным на разных портах).

ИМО, вы можете добавить скрипт в ExecStart и убедиться, что он forking и добавьте для него способ найти основной файл PID или, по крайней мере, файл PID, который означает «если он мертв, перезапустите службу».

Может быть, в идеале создать по одному служебному файлу с «простыми» словами для каждого демона?

[Unit]
Description=Internet PVR for your TV Shows
After=cryptsetup.target

[Service]
ExecStart=/usr/bin/python2 /path/to/Sick-Beard/SickBeard.py
Type=simple
User=<user under which to run>
Group=<group of said user>

[Install]
WantedBy=multi-user.target

И этот разветвляющийся

[Unit]
Description=Binary Newsreader
After=cryptsetup.target

[Service]
ExecStart=/usr/bin/python2 /path/to/sabnzbd/SABnzbd.py -d -f /path/to/inifile --pid /run/sabnzbd
Type=forking
PIDFile=/run/sabnzbd/sabnzbd-8080.pid
User=<user to run the process>
Group=<group of said user>

[Install]
WantedBy=multi-user.target