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
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
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
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.