私はUbuntu 12.04とbashを実行しています。私はアラームが鳴った後に自動的にオフになるアラームを設定できる2つのシェルスクリプトを作成しました。最初はalarmset
時間を入力し、ユーザーのcrontabで警告行を変更できるようにします。この行は、alarmring
ブラウザウィンドウでブロードキャストプレーヤーを起動し、crontabで警告行をコメントアウトする2番目のスクリプトを起動します。
alarmring
異常な行動。直接実行すると、ブラウザウィンドウを起動し、crontabを編集する2つのことが行われます。ちなみに、実行すると、指定された時間にalarmset
crontabが起動するとcrontabは編集されますが、ブラウザウィンドウは実行されません。alarmring
alarmring
最後に、crontabを実行するとコマンドはalarmring
無視されますset -x
が、直接実行するとset -x
コマンドが実行されます。したがって、crontabは最初の10行をスキップしたのと同じです。
何が起こったのかと思いますか?以下に2つのスクリプトと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モニターでウィンドウを開く(「モニターを開けません」理由)?より多くの情報を知りたいです。
~
これは、ホームディレクトリがシェル機能であるため、crontabでは利用できないことを意味します。同じ理由で、HOME
ホームディレクトリへのフルパスは使用できません。
PATH=/home/username/bin:/usr/bin:/bin
bashをシェルとして使用することは、~
bashが拡張されたため実際に機能します~
。PATH
しかし、これはbashにとって奇妙なことであり、他のシェルや他のプログラムはこのようには機能しません。
このコマンドは、に設定されている場合を除いて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
のエントリはルートとして実行されます。デフォルトでは、ルートは特定のユーザーのモニターにアクセスできません。
crontab エントリを作成するには、crontab を追加するユーザー機能を使用することをお勧めします。これは、crontab -e
指定したユーザーとしてログインしたシェルでコマンドを使用して実行できます。
このコマンドは、テキストエディタ(通常はまたは)をcrontab -e
開き、システムファイルにエントリを追加するのと同じ構文を使用してエントリを追加できます。vi
vim
/etc/crontab
これチュートリアルでは、crontabアンサンブルを追加するための基本について説明します。。
また、ユーザーのcrontabを追加してスクリプトがモニターにアクセスする必要がある場合(GUIを起動すると仮定)、GUIが正しいモニターに接続されるようにcrontab -e
環境変数()を設定する必要があります。export DISPLAY=:0.0
例えば
% 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