it-swarm.com.de

Upstart-Skript für einen Übertragungs-Daemon, der als normaler Benutzer ausgeführt wird

Ich habe ein Skript erstellt, um den Transmission-Daemon als normaler Benutzer zu starten:

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

Dieses Skript funktioniert, aber ich sehe zwei Prozesse bei der Ausführung von 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

Ist das richtig? Gibt es eine andere Möglichkeit, dies besser auszuführen?

Hinweis: Das Standard-Startskript des Übertragungspakets ist deaktiviert .

Mehr Infos:

Wenn ich die Übertragung als Daemon durchführe (ohne foreground), liegt das Problem in der erkannten PID von 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

aber das ist wirklich die PID von Sudo ( abgeschlossener Prozess ), der Übertragungs-Daemon PID ist eine andere:

$ 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, die Lösung ist, den Transmission-Daemon im Vordergrund zu starten (keine Gabelung oder Daemon erwarten) und start-stop-daemon die PID-Datei zu erstellen.
Das komplette Drehbuch:

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

Die Verwendung von --foreground ist korrekt - Sie möchten, dass der Emporkömmling den Fortschritt Ihres Übertragungsprozesses verfolgt. Um --foreground wegzulassen, fügen Sie expect daemon zur Init-Konfiguration hinzu. Dies folgt auf zwei Teilschritte des Prozesses. So werden Dienste dämonisiert.

Die Verwendung von start-stop-daemon ist suboptimal, da Upstart Ihren Prozess nicht überwachen und ihn im Falle eines Absturzes nach Bedarf erneut starten kann.

Hier ist meine Konfiguration:

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

Wenn Sie eine App mit su -c starten, wartet su darauf, dass die App beendet wird. Wenn Sie in Ihrem Fall die Option --foreground hinzugefügt haben, lassen Sie die Übertragung so ablaufen, dass sie sich nicht von der übergeordneten Komponente löst. So werden Sie su als einen übergeordneten Prozess von transimssion-daemon für die gesamte Zeit sehen, in der dieser lebt.

Wenn Sie diese Option entfernen, wird der Prozess su beendet, sobald transmission-daemon in den Hintergrund tritt.

Abgesehen von der Entfernung dieser Option, die für einen Dienst unpassend erscheint, schlage ich vor, sie zu verwenden

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

statt su, der Ubuntu-Arbeitsweise näher zu sein und Optionen einfacher zu verwalten, ohne einfache Anführungszeichen verwenden zu müssen.

1
enzotib