Bash

一個基本的 Bash 腳本(用於啟動一個 GUI 程序)在 cron 中部分工作

  • April 28, 2022

我使用此腳本在夜間重新啟動 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_proxyhttps_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

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