奇怪的 crontab 脚本交互 (bash)

奇怪的 crontab 脚本交互 (bash)

我正在运行 Ubuntu 12.04 和 bash。我编写了两个 shell 脚本,可以让我设置一个闹钟,闹钟响后,它会自行取消设置。第一个,alarmset允许我输入时间并修改我的用户 crontab 中的警报行。该行启动第二个脚本 ,alarmring该脚本在浏览器窗口中启动广播播放器,然后在 crontab 中注释掉警报行。

alarmring行为异常。如果我自己直接运行它,它会执行这两个操作:启动浏览器窗口并编辑 crontab。但是,如果我运行alarmset,当 crontabalarmring在指定时间启动时,alarmring编辑 crontab,但不启动浏览器窗口。

最后,当 crontab 运行时alarmring,它会忽略该set -x命令,而当我直接运行它时,set -x则会执行该命令。所以就好像 crontab 跳过了前十行。

对发生的事情有什么想法吗?我将粘贴下面的两个脚本和 crontab。

警报设置:

#!/bin/bash

# alarmset

set -x

usage()
{ echo "alarmset [ hour minute | -h ]" }

editcrontab() 
{ 
    echo $'/alarmring/s/^\(.*\)\(\* \* \*\)/'$2$' '$1$' \\2/' > ~/Documents/crontab_script.txt 
    crontab -l | sed --file=/home/username/Documents/crontab_script.txt > ~/Documents/new_crontab.txt crontab ~/Documents/new_crontab.txt 
}

### MAIN 
case $# in 
    2 ) editcrontab $1 $2 ;; 
    * ) usage 
        exit ;; 
esac

set +x

警报声:

#!/bin/bash

# alarmring

set -x

env DISPLAY=:0

# Ring the alarm : launch BBC World Service in Firefox 
firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service

# Unset the alarm : comment out the alarm line in the crontab 
crontab -l | sed '/alarmring/s/^/#/1' > ~/Documents/new_crontab.txt 
crontab ~/Documents/new_crontab.txt

set +x

定时任务:

SHELL=/bin/bash 
PATH=~/bin:/usr/bin:/bin 
# 
# m h dom mon dow command 
53 07 * * * /home/username/bin/alarmring

答案1

要运行 GUI 程序,您需要设置DISPLAY环境变量,并且可能XAUTHORITY还需要设置环境变量。看 在远程 X 显示器上打开窗口(为什么“无法打开显示器”)?了解更多信息。

~这意味着您的主目录是 shell 功能,您不能在 crontab 中使用它。出于同样的原因,您不能使用HOME.使用主目录的完整路径:

PATH=/home/username/bin:/usr/bin:/bin

使用 bash 作为 shell~实际上是有效的,因为 bash 扩展~PATH.但这是 bash 的一个奇怪之处,没有其他 shell 或其他程序可以这样工作。

该命令env DISPLAY=:0显示当前环境,DISPLAY设置为 的情况除外:0。那没有用。你大概是说export DISPLAY=:0

你的安排很复杂。 Cron 是为重复任务而设计的。如果您只想安排一次后台作业,请使用

at 7:53 <<EOF
firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service
EOF

At 保留DISPLAY环境变量,因此如果您at从 GUI 运行命令并希望 Firefox 显示窗口,则无需手动设置它。

答案2

系统 crontab ( /etc/crontab) 或目录(/etc/cron.d- 或 -/etc/cron.hourly等)中的条目以 root 身份运行。默认情况下,root 可能无法访问给定用户的显示器。

我建议使用用户添加 crontab 的能力来创建 crontab 条目。这可以通过在crontab -e以指定用户身份登录的 shell 中使用命令来完成。

该命令crontab -e将打开一个文本编辑器(通常vi为 或vim),您可以使用与向系统/etc/crontab文件添加条目相同的语法来添加条目。

教程涵盖了添加 crontab 整体的基础知识

此外,当通过添加用户的 crontabcrontab -e并且您的脚本需要访问您的显示器(假设您正在启动 GUI)时,您需要设置环境变量 ( export DISPLAY=:0.0),以便 GUI 定向到正确的显示器。

例如

% crontab -e

并添加以下行:

53 07 * * * export DISPLAY=:0.0;/home/username/bin/alarming

答案3

$ xauth extract - :0 | sudo xauth -f /root/.Xauthority merge -

它们也从不同的终端运行,所以你需要

$ DISPLAY=:0 xclock

相关内容