<p>尝试从<code>cron</code>启动浏览器时最明显的问题是,即使您的计算机上运行有X,也不会为从<code>crontab</code>运行的进程设置<code>DISPLAY</code>环境变量,因此从那里启动浏览器将失败。</p>
<p>解决方案从琐碎到复杂。一个简单的解决方案是接受如果没有X运行,脚本将不会运行,并手动将<code>DISPLAY</code>设置为<code>:0</code>,这是Ubuntu启动的默认X服务器的默认显示号。</p>
<p>例如,如果我将这个命令放在<code>crontab</code>行的<code>command</code>列中,Chrome将在没有问题的情况下启动:</p>
<pre><code>DISPLAY=:0 google-chrome
</code></pre>
<p>特定于用户的crontab文件中的完整行如下:</p>
<pre><code>0 * * * * DISPLAY=:0 google-chrome
</code></pre>
<p>如果您想运行一个python脚本,该脚本通过selenium启动chrome,那么这行代码应该如下所示:</p>
<pre><code>0 * * * * DISPLAY=:0 python my_script.py
</code></pre>
<p>命令字符串就像发送给shell一样发送,因此在上一个示例中,字符串<code>DISPLAY=:0 python my_script.py</code>将直接传递给shell。通常的shell语法是将命令开始时立即给定的变量赋值解释为设置环境变量。(当然是<code>dash</code>和<code>bash</code>的情况,其中一个可能是大多数安装中的默认shell。)因此shell解释的命令将环境变量<code>DISPLAY</code>设置为值<code>:0</code>,然后运行<code>python my_script.py</code>。由于<code>python</code>从启动它的shell继承了它的环境,因此变量<code>DISPLAY</code>对它也是<code>:0</code>。</p>
<p>设置<code>DISPLAY=:0</code>就像我在上面显示的那样,只为下面的命令设置变量<em>。对于crontab执行的所有命令,也可以将<code>DISPLAY</code>设置为<code>:0</code>。例如,在以下特定于用户的crontab中:</p>
<pre><code>DISPLAY=:0
30 * * * * google-chrome
0 * * * * python my_script.py
</code></pre>
<p>行<code>DISPLAY=:0</code>为执行<code>google-chrome</code>和<code>python my_script.py</code>设置环境变量<code>DISPLAY</code></p>