私は、通常のユーザーとして送信デーモンを開始するスクリプトを実行しました。
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
解決策は、フォアグラウンドで送信デーモンを開始することです(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
--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
su -c
でアプリを起動すると、suはアプリが終了するのを待ちます。あなたの場合、--foreground
オプションを追加して、その親から切り離さないように送信します。したがって、su
は、transimssion-daemon
の親プロセスとして、後者が存続する間ずっと表示されます。
このオプションを削除すると、transmission-daemon
がバックグラウンドに移行するとすぐにsu
プロセスが終了することがわかります。
サービスに適していないと思われるオプションを削除する以外に、使用することをお勧めします
Sudo -u <your-user> app-name options
su
の代わりに、Ubuntuのやり方に近づき、一重引用符を使用せずにオプションをより簡単に管理できます。