奇妙なcrontabスクリプトインタラクション(bash)

奇妙なcrontabスクリプトインタラクション(bash)

私はUbuntu 12.04とbashを実行しています。私はアラームが鳴った後に自動的にオフになるアラームを設定できる2つのシェルスクリプトを作成しました。最初はalarmset時間を入力し、ユーザーのcrontabで警告行を変更できるようにします。この行は、alarmringブラウザウィンドウでブロードキャストプレーヤーを起動し、crontabで警告行をコメントアウトする2番目のスクリプトを起動します。

alarmring異常な行動。直接実行すると、ブラウザウィンドウを起動し、crontabを編集する2つのことが行われます。ちなみに、実行すると、指定された時間にalarmsetcrontabが起動するとcrontabは編集されますが、ブラウザウィンドウは実行されません。alarmringalarmring

最後に、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プログラムを実行するには環境変数を設定する必要がありDISPLAYXAUTHORITY環境変数も設定する必要があります。バラより リモートXモニターでウィンドウを開く(「モニターを開けません」理由)?より多くの情報を知りたいです。

~これは、ホームディレクトリがシェル機能であるため、crontabでは利用できないことを意味します。同じ理由で、HOMEホームディレクトリへのフルパスは使用できません。

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

bashをシェルとして使用することは、~bashが拡張されたため実際に機能します~PATHしかし、これはbashにとって奇妙なことであり、他のシェルや他のプログラムはこのようには機能しません。

このコマンドは、に設定されている場合を除いてenv DISPLAY=:0現在の環境を表示します。それは無駄です。おそらく。DISPLAY:0export DISPLAY=:0

あなたの合意は複雑です。 Cronは繰り返し作業のために設計されています。バックグラウンドタスクを一度だけスケジュールするには、次のようにします。存在する

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

At はDISPLAY環境変数を保持するため、atGUI でコマンドを実行し、Firefox にウィンドウを表示させるために手動で設定する必要はありません。

答え2

システムcrontab(/etc/crontab)またはディレクトリ(/etc/cron.d- または - など)/etc/cron.hourlyのエントリはルートとして実行されます。デフォルトでは、ルートは特定のユーザーのモニターにアクセスできません。

crontab エントリを作成するには、crontab を追加するユーザー機能を使用することをお勧めします。これは、crontab -e指定したユーザーとしてログインしたシェルでコマンドを使用して実行できます。

このコマンドは、テキストエディタ(通常はまたは)をcrontab -e開き、システムファイルにエントリを追加するのと同じ構文を使用してエントリを追加できます。vivim/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

関連情報