如何让 shell 脚本在重新启动时正确执行

如何让 shell 脚本在重新启动时正确执行

我有一个 shell 脚本,它从 github 获取更新,然后运行它检索到的代码。它位于/home/me/Desktop/refreshCode.sh

-- refreshCode.sh --

#!/bin/bash

cd /home/me/src/ProductionMonitor
sudo /usr/bin git -C /home/me/src/ProductionMonitor pull
sudo cp /home/me/src/ProductionMonitor/* /home/me/Desktop/Production
cd /home/me/Desktop/Production
sudo /usr/bin/python3 prodmain.py >> logfile.data

我知道 shell 可以手动启动并按预期运行。它会打开 tkinter 窗口,我可以与屏幕进行交互。

但是我似乎无法正确启动任何东西。

我尝试为 @reboot 设置 crontab,但没有成功。它从未显示过用户界面

我设置了一个 Systemd 服务。

-- prodmon.service --

[Unit]
Description=Service to run production monitor
After=multi-user.target

[Service]
Type=forking
ExecStart=/home/me/Desktop/refreshCode.sh
User=caleb
Group=caleb
WorkingDirectory=/home/me/Desktop/Production/
PIDFile=/var/run/prodmon.pid

[Install]
WantedBy=multi-user.target

启动后查看服务状态,显示正在运行。但是 tkinter UI 从未显示。

答案1

你可能不应该 sudo 所有的东西;所有的东西都在你自己的目录下。

您问题的要点是,您的脚本不知道在哪里显示窗口。尝试添加

echo "DISPLAY=$DISPLAY" >> logfile.data

你可能会看到

DISPLAY=

在`logfile.data中。此外,如果您使用:

/usr/bin/python3 prodmain.py >> logfile.data 2>/tmp/errorfile

你可能会看到/tmp/errorfile类似这样的内容:

prodmain: Xt error: Can't open display: 
prodmain: DISPLAY is not set

因此,这就是它在启动时不显示的原因。

现在如何解决这个问题:这很大程度上取决于您想要什么。您可以从~/.xinitrc登录图形环境时启动该程序。您可以将工作分为两部分:在启动时执行 和gitcp以及prodmain.xinitrc.

相关内容