0

我想每 50 分钟(3000 秒)将我的屏幕设置为屏幕保存状态。

cat /home/rest.sh  
while true;do
sleep  3000
xscreensaver-command --lock  1>/dev/null
done 

sh /home/rest.sh &可以让它运行。
现在我想将它设置为守护进程。

sudo vim  /etc/systemd/system/screensave.service
[Unit]
Description=screensave 

[Service]
User=root
ExecStart=/bin/bash /home/rest.sh  
StandardError=journal

[Install]
WantedBy=multi-user.target

设置它并作为守护进程启用。

systemctl enable screensave.service

我发现该服务没有作为守护程序运行。

sudo journalctl -u  screensave
Jan 24 12:16:50 user systemd[1]: Started screensave.
Jan 24 12:17:22 user bash[621]: xscreensaver-command: warning: $DISPLAY is not set: defaulting to ":0.0".
Jan 24 12:17:22 user bash[621]: No protocol specified
Jan 24 12:17:22 user bash[621]: xscreensaver-command: can't open display :0.0

设置 $DISPLAY 后如何将其作为守护进程运行?

4

2 回答 2

0

我没有运行linux,现在无法检查,但守护进程的步骤是关闭stdin stdout stderr 将当前工作目录更改为/ 并分叉两次并设置id,以便当前进程成为新的会话负责人。

在开始时添加这样的东西,在运行之前,首先要检查的是 exec 命令创建一个新的会话领导进程ps -Cbash -o sid,pgid,pid,ppid,comm,args

# checking if current process is a session leader to avoid infinite call
if [[ $(ps -p $$ -osid=) != $$ ]]; then
    ( cd / ; exec setsid /bin/bash /home/rest.sh & ) </dev/null 1>&0 2>&0 &
    exit
fi  
于 2018-01-24T05:19:51.230 回答
0

这是一个非常常见的常见问题解答。系统守护进程无法轻松连接到X任何单个用户的会话。在多用户系统上,你怎么知道要连接到哪个用户的会话呢?在单用户系统上,如果没有会话正在运行(因为它通常不是在守护程序启动时),守护程序应该做什么?

试图以任何特定用户的身份运行系统守护程序是行不通的,并且让单个用户访问系统守护程序是安全问题的秘诀。可以做到,但解决方案很复杂,可能不是您想自己尝试的。(简单地说,让守护进程监听套接字上的命令;创建一个知道如何与套接字对话的用户空间程序,并构建某种授权和身份验证,以便守护进程知道它正在与谁交谈并可以验证该用户允许连接到此显示器。)

最简单的解决方案是从桌面环境的启动脚本中运行它。大多数桌面都有“会话启动项”或“登录时自动运行”挂钩。

于 2018-01-24T06:03:25.733 回答