一個基本的 Bash 腳本(用於啟動一個 GUI 程序)在 cron 中部分工作
我使用此腳本在夜間重新啟動 Firefox(以應用包管理器和外掛更新):
#!/bin/bash killall -s SIGTERM firefox; sleep 15 firefox -P "user" & firefox -P "default settings" &
crontab(凌晨 3 點執行):
0 3 * * * /usr/local/bin/firefox.sh
手動執行時,腳本按預期工作:關閉 Firefox 程序並在各自的視窗中啟動兩個配置文件。
當 cron 執行腳本時,Firefox 始終只關閉。
cron
作業在完全獨立的環境中執行,與您通常的 GUI 桌面或終端環境隔離。
firefox
期望作為桌面環境的子程序執行,或者至少有一個有效的DISPLAY
變數集。有時可以讓 cron 作業啟動或與 GUI 程序互動。嘗試添加
export DISPLAY=:0.0
為腳本的第二行。如果:0.0
不起作用,請在桌面上執行終端並執行echo $DISPLAY
以獲取正確的值。如果這仍然不起作用,您可能還需要設置
XAUTHORITY=$HOME/.Xauthority
或使用xauth
來啟用訪問。請注意,任何從 cron 啟動的程序(包括 firefox)都將繼承 cron 相當簡約的環境。PATH、LOGNAME 和/或 USER 等變數可能與您的預期不同,而且許多變數根本不會設置。例如,可能未設置 LC_* 語言環境變數(取決於發行版 - 例如 Debian 中的 cron 讀取
/etc/environment
和/etc/default/locale
. 我不知道 Fedora 上是否也是這種情況)。如果該程序需要將特定環境變數設置為特定值,則需要在 crontab 文件中設置它們,或者export
也在腳本中設置它們。或者只是source
腳本中常用的 shell 啟動文件。Firefox、Chromium 和其他網路瀏覽器可能需要
http_proxy
,https_proxy
以及其他與代理相關的變數設置。僅供參考,這大致是執行 GUI 程序的
ssh -X
工作方式。該-X
選項啟用 X11 轉發。它通過 ssh 連接建立一個代理 X 協議的隧道,並將 DISPLAY 變數設置為指向該隧道。例如,我使用它
xsane
在我的伺服器上執行(主機名“ganesh”,它連接了 HP3030 列印機/掃描器),但在我的工作站顯示器上顯示視窗 - 即ssh -X ganesh xsane
.如果我要執行
ssh -X ganesh 'echo $DISPLAY'
(需要單引號或轉義,以便我的本地 shell 不會插入變數),我會看到如下內容:$ ssh -X ganesh 'echo $DISPLAY' ganesh:11.0