具有独立屏幕的 Systemd

具有独立屏幕的 Systemd

我想用screen独立的命令来启动服务。背景是,它应该读取串行接口,并重新连接到屏幕,我希望能够在出现错误时进行交互,或者通过串行接口发送命令。

目前我有

系统服务文件

[Unit]
Description=read serial interface

[Service]
User=someUser
Group=someUser
Type=forking
Restart=on-failure
RestartSec=3
WorkingDirectory=/home/someUser/dev
ExecStart=/usr/bin/screen -DmS serial-magic /home/someUser/dev/run-serial-magic.sh

[Install]
WantedBy=multi-user.target

/home/someUser/dev/run-serial-magic.sh 下的脚本

#!/bin/bash

pio device monitor -b 115200 -p /dev/ttyUSB0 | tee test.log

我已经尝试过了

  • 移动screen脚本内部。
  • 使用Type=simple屏幕选项-d而不是-D

如果我从命令行手动调用该脚本,则该脚本可以正常工作。我可以返回屏幕并再次将其分离。但是当我开始服务时sudo journalctl -f -u someServoce.service就给了我

Okt 23 18:13:28 someHost systemd[1]: Starting read serial interface...

screen -list

No Sockets found in /run/screen/S-someUser.

答案1

在这种情况下,考虑到您已验证屏幕实际上正在运行,我假设您的服务文件中的“someUser”实际上与screen -list错误中的 someUser 不同。在这种情况下,您应该在屏幕中启用多用户支持。

既然您打算像服务一样使用它,那么您应该

    echo "multiuser on" >> /home/<service user>/.screenrc
    echo "acladd <user who needs access to screen>" >> /home/<service user>/.screenrc

这会将其添加为服务用户屏幕的默认设置。如果您仅使用该用户的服务,则更建议为屏幕创建一个单独的配置文件并使用调用它

    /usr/bin/screen -c /path/to/config.conf -DmS serial-magic /home/someUser/dev/run-serial-magic.sh
    

在您的服务文件的“ExecStart =”中

然后您将能够使用以下方式访问屏幕screen -x <service user>/serial-magic

我已经在我的测试服务器 RHEL 7 中验证了这一点。

相关内容