Estou tentando executar um programa com uma interface ncurse como um daemon usando a tela. Eu quero usar start-stop-daemon para gerenciar o processo, mas estou tendo problemas para criar um script de inicialização do SysV.
Variáveis:
NAME=rtorrent
CHDIR=/opt/$NAME
DAEMON=$NAME
DAEMON_ARGS="-d -m -S $NAME $DAEMON &> /dev/null"
USER=media
GROUP=media
PIDFILE=/var/run/$NAME.pid
Atualmente, minha função de início é esta:
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
pgrep -F $PIDFILE > /dev/null 2>&1 || return 1
start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE --chuid $USER:$GROUP --chdir $CHDIR --background --exec screen -- $DAEMON_ARGS || return 2
}
Mas isso é armazenar o ID do processo sleep
. Concebivelmente, o daemon pode ficar inativo e deixar o processo sleep
em execução
Minha função de parada precisa parar os dois, então eu tenho:
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
pgrep -F $PIDFILE > /dev/null 2>&1 || return 1
for i in 'ps -C $NAME -o pid=' ; do kill $i ; done
pgrep -F $PIDFILE > /dev/null 2>&1 || return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
}
O que deve funcionar (ainda não testado), mas com o problema que derrubará qualquer outro processo criado por qualquer outro usuário com $NAME
como em seu nome ou argumentos.
Acho que minha solução é que a minha função ps
retorne apenas os pids dos nomes dos processos $NAME
, que foram criados por $USER
. Como esse daemon será executado sob um ID do usuário dedicado.
Não sei como obter essa saída. ps -C $NAME -u $USER o pid=
me dá uma lista para cada partida, mas eu quero uma lista para ambas as partidas. Incase eu decido que este usuário pode lidar com algum outro processo mais tarde.
Além disso, que tal recarregar?
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
recarregará o processo screen
, recarregará o daemon? Existe uma maneira melhor?
Qualquer ajuda muito apreciada.
Tags gnu-screen init sh linux daemon