web-dev-qa-db-fra.com

Script Upstart pour un démon de transmission exécuté en tant qu'utilisateur normal

J'ai créé un script pour lancer transmission-daemon en tant qu'utilisateur normal:

start on filesystem
stop on runlevel [!2345]

respawn
respawn limit 10 5

pre-start script
    test -x /usr/bin/transmission-daemon || { stop; exit 0; }
    test -d /home/user/.config/transmission-daemon || { stop; exit 0; }
end script

exec su -l -c 'transmission-daemon --foreground --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log' user

Ce script fonctionne, mais je vois deux processus en exécution de transmission-daemon:

user     5041  0.0  0.0  48556  1516 ?        Ss   01:10   0:00 su -l -c transmission-daemon --foreground --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log user
user     5048  0.5  0.0 150432  2960 ?        Sl   01:10   0:00 transmission-daemon --foreground --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log

Est-ce correct? Y a-t-il un autre moyen de mieux l'exécuter?

Remarque: Le script de démarrage par défaut du package de transmission est désactivé .

Plus d'infos:

Si j'exécute la transmission en tant que démon (sans foreground), le problème est le PID détecté par init:

start on filesystem
stop on runlevel [!2345]

expect fork

pre-start script
    test -x /usr/local/bin/transmission-daemon || { stop; exit 0; }
    test -d /home/mario/.config/transmission-daemon || { stop; exit 0; }
end script

exec Sudo -u user transmission-daemon --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log

.

$ Sudo initctl list | grep trans
trans-test start/running, process 3110

mais en réalité c'est le PID de Sudo ( processus terminé ), le PID de transmission-démon en est un autre:

$ ps aux 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user     3148  0.0  0.0 154848  2708 ?        Ssl  13:33   0:00 transmission-daemon 
4
Juan Simón

Ok, la solution est de lancer transmission-daemon en avant-plan (aucun attribut fork ou daemon) et que start-stop-daemon crée le fichier pid.
Le script complet:

description "Transmission daemon for user"

start on (local-filesystems and net-device-up IFACE=eth0 and runlevel [235])
stop on runlevel [016]

kill timeout 50

respawn

env USER=user
env PIDFILE=/var/run/transmission-user.pid

script
    DAEMON=$(which transmission-daemon) || exit 0
    CONFIGDIR=/home/$USER/.config/transmission-daemon

    exec start-stop-daemon --start --quiet --chuid $USER --pidfile $PIDFILE --make-pidfile --exec $DAEMON -- -f --config-dir $CONFIGDIR --logfile $CONFIGDIR/daemon.log
end script

post-stop exec rm -f $PIDFILE
2
Juan Simón

Utiliser --foreground est correct - vous voulez que Upstart suive l’avancement de votre processus de transmission. Pour omettre --foreground, ajoutez expect daemon à la configuration initiale qui suivra deux processus du processus, à savoir la démonisation des services.

Utiliser start-stop-daemon est sous-optimal, car upstart ne peut pas surveiller votre processus et le réactiver si nécessaire en cas de plantage, etc.

Voici ma config:

start on (runlevel [2345] and filesystem and networking)
stop on runlevel [!2345]

respawn
kill timeout 30

setuid transmission

exec /usr/bin/transmission-daemon --foreground --config-dir /var/lib/transmission
2
sj26

Lorsque vous démarrez une application avec su -c, su attendra la fin de l'application. Dans votre cas, après avoir ajouté l’option --foreground, faites en sorte que la transmission ne se détache pas de son parent. Vous verrez donc su comme un processus parent de transimssion-daemon pendant tout le temps que ce dernier vit.

Si vous supprimez cette option, vous verrez que le processus su se terminera dès que transmission-daemon se retrouvera à l'arrière-plan.

En plus de supprimer cette option qui semble inopportune pour un service, je suggère d'utiliser

Sudo -u <your-user> app-name options

au lieu de su, plus proche de la manière de faire Ubuntu et plus simple à gérer les options sans avoir besoin d'utiliser des guillemets simples.

1
enzotib