我正在尝试使用systemctl
在新的共享会话中启动进程tmux
。我确信我的tmux
命令已全部设置好:
- 我已使用共享组设置套接字路径。
- 该服务正在属于该组成员的用户下执行
- 我已经从 CLI 进行了测试并且它可以工作;我可以附加另一个帐户。
该命令如下所示:
tmux -S /tmp/tmux/sharedsesh new-session -s sharedsesh -d "/usr/bin/java server.jar"
但是,当我将其放入新的 systemctl 单元时,我收到错误:“tmux:未知选项 -- S”。由于这是大写的 S,我想知道这是否意味着它无法访问套接字或类似的东西?
单元文件:
[Unit]
After=network.target
[Service]
WorkingDirectory=/srv/workspace
PrivateUsers=true
User=servhost
Group=servhost
ProtectSystem=full
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
ExecStart=/usr/bin/tmux -S /tmp/tmux/sharedsesh new-session -s sharedsesh -d "/usr/bin/java server.jar"
我查看了服务下的安全指令,但最终还是出现了错误。而且,我仍然想知道为什么它不知道 S 选项 - 我运行的命令与我在控制台上执行的命令相同,那么为什么它是未知的?
== 编辑 ==========
好的,就像经常出现的情况一样,发布之后我就发现了我的问题。
事实上我的ExecStart
线路很好 - 错误来自我后续的控制,可能是下一个:(语法错误)
ExecReload=/usr/bin/tmux send-keys -S /tmp/tmux/sharedsesh "reload" Enter
^ -S should be here ^ send-keys here
我要辩解的是,我收到的错误消息journalctl
没有显示行号。另外,我没想到这一点,因为我没想到它们会运行。
这导致了我的下一个问题:现在我已经修复了语法,很明显服务在启动后立即停止(并且Stopping timed out. Terminating.
启动错误)。
我猜我真正的问题是我的单元文件出了问题?还是不systemd
喜欢分离方式tmux
?还是其他原因?
答案1
看来答案是我需要Type=forking
在 Service 节中进行设置。接下来我必须弄清楚如何让服务管理器知道它是故意停止的(当会话终止时,控制进程认为这是崩溃)。但至少服务器tmux
和会话仍然存在,我可以与其他用户连接。