所以我想在 systemd 服务中运行 screen,这样我就可以在进程运行时(在守护进程内部)发出命令。请参阅问题末尾的示例,了解我希望能够做什么。
我目前拥有的:
ExecStart=/usr/bin/java -someArguments -jar server.jar
一个以-running 作为守护进程
启动的 java 应用程序,其中 user:group 设置为“server”:“server”,以及“ProtectSystem=full”和类似的强化参数。这运行良好,没有问题。
但是,我想要:
与上面相同,但它在屏幕实例中运行。像这样的东西:
ExecStart=/usr/bin/screen -DmS aServer /usr/bin/java -someArguments -jar server.jar
后者拒绝启动,输出journalctl -xe
告诉我:“无法执行命令:权限被拒绝”。但是,如果我自己在终端中执行此操作(与 ExecStart 中的命令相同),我可以从同一用户(服务器:服务器)启动屏幕会话。
我在网上找到了一个解决方案,上面写着:
# Uncomment this to fix screen on RHEL 8
ExecStartPre=+/bin/sh -c 'chmod 777 /run/screen'
但我本能地不喜欢 777 部分,我也不明白为什么每次守护程序启动时都需要运行它。
我基本上要问的是:如何让屏幕在 systemd 守护进程中工作?上述解决方案是个好主意,还是有更好的方法?
我希望能够做的例子:
- 有一个 systemd 计时器,
ExecStartPre=/screen -p 0 -S -X eval 'stuff "save-all"\\015'
其序列中有一个(或类似的)。 - ExecStop 期间的一系列命令,如上面的命令。
- 当我手动连接到 Linux 服务器(连接到屏幕实例)时,能够与进程交互。