web-dev-qa-db-ja.com

通常のユーザーとして実行される伝送デーモンの起動スクリプト

私は、通常のユーザーとして送信デーモンを開始するスクリプトを実行しました。

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

このスクリプトは機能しますが、伝送デーモンの実行中に2つのプロセスが表示されます。

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

これは正しいです?これをより良く実行する別の方法はありますか?

注:伝送パッケージのデフォルトの起動スクリプトは無効になっています

詳細

送信をデーモンとして(foregroundなしで)実行する場合、問題はinitによって検出されたPIDです。

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

しかし、実際にはこれはSudoのPID(finished process)であり、伝送デーモンPIDは別のものです。

$ 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

解決策は、フォアグラウンドで送信デーモンを開始することです(forkまたはデーモンを期待しない)。そのstart-stop-daemonはpidファイルを作成します。
完全なスクリプト:

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

--foregroundを使用するのは正しいことです。送信プロセスの進行状況をupstartで追跡する必要があります。 --foregroundを省略するには、init configにexpect daemonを追加します。これは、プロセスの2つの分岐、つまりサービスをデーモン化する方法に従います。

Upstartはプロセスを監視できず、クラッシュなどの場合に必要に応じて再生成できないため、start-stop-daemonの使用は最適ではありません。

これが私の設定です:

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

su -cでアプリを起動すると、suはアプリが終了するのを待ちます。あなたの場合、--foregroundオプションを追加して、その親から切り離さないように送信します。したがって、suは、transimssion-daemonの親プロセスとして、後者が存続する間ずっと表示されます。

このオプションを削除すると、transmission-daemonがバックグラウンドに移行するとすぐにsuプロセスが終了することがわかります。

サービスに適していないと思われるオプションを削除する以外に、使用することをお勧めします

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

suの代わりに、Ubuntuのやり方に近づき、一重引用符を使用せずにオプションをより簡単に管理できます。

1
enzotib