如何在设置$ DISPLAY后将程序设置为守护进程?

时间:2018-01-24 04:37:55

标签: bash daemon systemctl

我希望每隔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后将其作为守护进程运行?

3 个答案:

答案 0 :(得分:0)

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

在开始时添加类似这样的东西,在运行之前,要检查的第一件事是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  

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-1)

crontab -e
@reboot /bin/sh -c "while true;do sleep  3000;xscreensaver-command --lock  1>/dev/null;done"  

问题已解决。