基本的 Bash 脚本(用于启动 GUI 程序)部分在 cron 中工作

基本的 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 始终只是关闭。

答案1

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

相关内容