Предполагая, что у меня есть сценарий оболочки, подобный этому: -
#!/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 вещи:
./cherrypy_server.sh start
./cherrypy_server.sh stop
./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