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