Ubuntu

如何讓 shell 腳本在重新啟動時正確執行

  • March 5, 2019

我有一個 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 從未出現過。

你可能不應該 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登錄到圖形環境時啟動程序。您可以將工作分為兩部分:在啟動時執行gitand以及從.cp``prodmain``.xinitrc

引用自:https://unix.stackexchange.com/questions/504552