如何使用非特权用户的 upstart 作业启动屏幕会话?

如何使用非特权用户的 upstart 作业启动屏幕会话?

我正在尝试创建一个screen在启动时启动新会话的 Upstart 作业,我想在其中自动启动java可执行文件。这是我目前正在尝试使用的 .conf 文件,尽管我已经尝试了其他几个文件:

description     "Run the bungeecord jar"

start on (local-filesystems and net-device-up IFACE=eth0 and runlevel [2345])
stop on runlevel [016]

exec start-stop-daemon --start -c ridog --exec /usr/bin/screen -- -dmUS BungeeCord java -server -XX:UseSSE=4 -XX:+UseCMSCompactAtFullCollection -XX:MaxPermSize=356m -XX:ParallelGCThreads=6 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+UseCompressedOops -XX:+AggressiveOpts -Xmx256M -jar BungeeCord.jar

pre-stop script
    screen -S BungeeCord -X foo "end^M"
end script

据我所知,该脚本似乎工作正常,我可以运行sudo start bungeecord并获得预期结果,但是重新启动机器不起作用。相反,我在以下位置收到此错误/var/log/upstart/bungeecord.log

Cannot make directory '/var/run/screen': Permission denied

我查过这个错误,搜索结果模糊且不确定。我尝试以 root 身份运行该命令,这消除了错误,但仍然没有screen会话。我尝试过像这样的不同命令:

su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"

答案1

通过 upstart 调用 screen 确实有点棘手。不过,关于不存在的第一个问题/var/run/screen可以很容易解决。

在 Ubuntu 10.10 到 13.10 上,有一个 upstart 任务负责/var/run/screen在启动时清理和(重新)创建,因此您需要确保您的 upstart 脚本将在其之后运行:

start on stopped screen-cleanup

在 Ubuntu 10.04 及更早版本以及 Ubuntu 14.04 及更高版本上,该代码位于 init 脚本中,/etc/init.d/screen-cleanup这意味着新贵作业可以将其作为以下结果引用rc

start on stopped rc

然而,screen 可能仍然会抱怨 /var/run/screen 权限。可以通过 setsid 调用 screen 来解决此问题:

exec setsid screen -Dm /some/command

您的屏幕会话将分叉一次,因此您需要添加“expect fork”节以确保 upstart 遵循正确的 pid。

这是一个完整的示例脚本(至少需要 Ubuntu 12.04):

# screen startup script
# requires upstart v1.4 or newer

description "running top in screen session"

start on ( local-filesystems
           and stopped rc )
stop on runlevel [!2345]

respawn

setuid test
setgid test

# "setsid screen -Dm" only forks once
expect fork

# use setsid to avoid screen complaining about /var/run/screen permissions.
exec setsid screen -Dm -S mytopsession /usr/bin/top

答案2

在拨打电话之前创建/var/run/screen具有适当权限的权限。rootscreen

答案3

问题解决了,我从使用切换upstart到使用cron。它变得简单多了,现在一切都很好。

对于阅读本文的任何人可能对我是如何做到的感到好奇,我做了一个简单的shell script

#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar

并将其设置为在启动时运行,并在以下位置添加新行crontab -e

@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh

感谢您的帮助!

相关内容