我正在尝试制作一个 systemd 单元,它可以无头启动 GNU screen 中的脚本。我确实根据一些人提出的几个相关问题完成了我的工作。我还在ExecStart
shell 中以它应该启动的用户身份测试了该行,并且它有效。
/usr/lib/systemd/system/devredacted.service
这是我创建并放置在...中的编辑过的 systemd 单元文件。
[Unit]
Description=redacted development site inside screen
After=network-online.target
[Service]
Type=forking
Restart=on-failure
RestartSec=3
User=dev
Group=dev
ExecStart=/usr/bin/screen -L -dmS redacted-dev /home/dev/run.sh
当启动它时,我使用它来查找它,但它没有出现ps aux | grep screen
,当我检查状态时,我看到了这个...
Oct 16 05:45:30 funbox systemd[1]: Starting devredacted.service - redacted development site inside screen...
Oct 16 05:45:30 funbox systemd[1]: Started devredacted.service - redacted development site inside screen.
Oct 16 05:45:30 funbox systemd[1]: devredacted.service: Deactivated successfully.
我以具有交互式 shell 的 systemd 单元用户身份对此进行了测试,并且单元文件执行的命令显然有效......
$ /usr/bin/screen -L -dmS redacted-dev /home/dev/run.sh
$ screen -ls
There is a screen on:
31790.redacted-dev (Detached)
1 Socket in /run/screen/S-dev.
答案1
我几乎想删除它,但我认为将其留在这里可以帮助那些在类似情况下寻求帮助的人。
问题实际上出在我的脚本中run.sh
,它使用了用户 dev 主目录中的可执行文件的路径,并以该用户身份运行。测试时,我已经在 /home/dev 中,但使用 systemd 时却不在。这意味着我的脚本将退出,GNU 屏幕将关闭。
解决方案很简单,只需设置工作目录......
[Service]
WorkingDirectory=/home/dev
问题已得到解决并且现在一切正常。