我正在运行 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
文件添加条目相同的语法来添加条目。
此外,当通过添加用户的 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