我已经编写了一个脚本,以普通用户身份启动 transmission-daemon:
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
该脚本可以运行,但是我看到 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
这是正确的吗?还有其他更好的方法吗?
笔记:transmission 包默认启动脚本被禁用。
更多信息:
如果我以守护进程的形式执行传输(不带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(完成过程),传输守护进程的 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
答案1
好的,解决方案是在前台启动 transmission-daemon (不期望 fork 或 daemon) 并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
使用--foreground
是正确的——您希望 upstart 跟踪传输过程的进度。若要省略,--foreground
请添加expect daemon
到 init 配置中,该配置将遵循进程的两个分支,这就是服务守护进程的方式。
使用start-stop-daemon
并不理想,因为 upstart 无法监视你的进程并且在发生崩溃等情况下根据需要重新启动它。
这是我的配置:
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
答案3
当您使用 启动应用程序时su -c
,su 将等待应用程序终止。 在您的例子中,添加了选项后--foreground
,使传输不与其父进程分离。 因此,在后者存在的所有时间内,您都将看到 的su
父进程transimssion-daemon
。
如果您删除该选项,您将看到该su
进程一旦transmission-daemon
进入后台就会终止。
除了删除似乎不适合服务的选项外,我建议使用
sudo -u <your-user> app-name options
而不是su
,这更接近 Ubuntu 的做事方式,并且更简单地管理选项,而不需要使用单引号。
答案4
我的版本:
start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]
# give time to send info to trackers
kill timeout 30
expect fork
respawn
script
USER=debian-transmission
test -f /etc/default/transmission-daemon && . /etc/default/transmission-daemon
test "$ENABLE_DAEMON" != "0" || exit 0
exec start-stop-daemon --start --quiet --chuid $USER --exec /usr/bin/transmission-daemon -- $OPTIONS
end script
炒锅好:
root@ubuntu-server:/etc/init# status transmission-daemon
transmission-daemon start/running, process 754
root@ubuntu-server:/etc/init# ps aux|grep [t]ransmission-daemon
torrent 754 0.0 1.1 41592 5596 ? Ssl Oct21 0:56 /usr/bin/transmission-daemon --auth --config-dir /var/lib/transmission-daemon/info