以普通用户身份执行的传输守护进程的 Upstart 脚本

以普通用户身份执行的传输守护进程的 Upstart 脚本

我已经编写了一个脚本,以普通用户身份启动 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

相关内容