我想用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 中验证了这一点。