ターミナルでのcronジョブからの出力の取得


15

勤務時間中に1時間に1回、端末にポップアップしたい出力を印刷するプログラムがあります。

$ crontab -l
0 07-17 * * * /home/dat/scripts/cron.out

syslogは次を報告します。

(dat) CMD (/home/dat/scripts/cron.exe)
Jun 18 12:02:01 picard CRON[10848]: (CRON) info (No MTA installed, discarding output)

私は何が欠けていますか?


cronジョブは端末に書き込むことを想定していません-利用可能なものがないかもしれません。
ガントベルト

回答:


14

汚い方法は、プログラムの出力を既存の端末のptsファイルにリダイレクトすることです。

PTSファイルを知るには、ttyコマンドを入力します

~$ tty
/dev/pts/4

あなたのcrontabは次のようになります:

0 07-17 * * * /home/dat/scripts/cron.out > /dev/pts/4

もう1つの方法は、ターミナルの引数としてプログラムを起動することです。

xfce4-terminal --command=/home/dat/scripts/cron.out --display=:0.0 -H

どこdisplayあなたは、端末を表示するX表示がある、-Hコマンドが終了した後、端末を開いたままに伝えることです。これにより、新しいターミナルが作成されます。

crontab:

0 07-17 * * * /usr/bin/xfce4-terminal --display=:0.0 -H --command=/home/dat/scripts/cron.out

ディスプレイが存在しない場合、syslogによってログにエラーが記録されます。


6

Cronは、スクリプトの出力をメールで送信します。残念ながら、Ubuntuはデフォルトではローカルメールを設定しません。そのため、Cronはログに「MTAがインストールされていません、出力を破棄しています」と表示します。

ローカルメールを設定することは、問題を解決する1つの方法です。ターミナルでの出力の代わりに、電子メール通知を受け取ります。

cronジョブを端末に出力する場合、その出力を端末にリダイレクトする必要があります。リダイレクト部分は簡単です—

0 07-17 * * * /home/dat/scripts/cron.out >/dev/pts/42 2>&1

しかし、問題はどの端末にリダイレクトするかを判断することです。それに対する普遍的な答えはありません。ログインしている端末の中から端末をどのように選択したいかによって異なります。

通常の使用では、GUI通知がより適切です。を使用できますnotify-send環境変数設定するDISPLAY必要があります

0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"

2

Cronはメーラーに出力を送信します。ターミナルで出力を表示する場合は、ファイルにログを記録し、tail -fを使用して、出力を表示するターミナルで出力を表示できます。


ファイルに記録する

  • 最も簡単な答えは、次のようなcrontabエントリを使用してファイルに直接ログを記録することです。

0 07-17 * * * /home/dat/scripts/cron.out > /path/to/log.txt 2> /path/to/error.txt

ログを記録する代替方法:

  • プログラムが書き込み可能なスクリプトである場合、ログファイルに出力をリダイレクトするようにプログラムを変更できます。echo output > log.txtまたは、以下で説明するラッパースクリプトを使用できます。
  • プログラムがバイナリまたは書き込み不可の場合、ラッパースクリプトを記述して出力をファイルにキャプチャする必要があります。

サンプルプログラムとラッパースクリプト:

$ cat program.sh wrapper.sh 
#!/bin/bash
# sample program
echo "arg 1=$1 arg2=$2 arg3=$3"
echo "sample error" >&2 

#!/bin/bash
# sample wrapper
exec ./program.sh "$@" >log.txt 2> error.txt

実行例1:

$ ./wrapper.sh 1 2 3 ; cat error.txt  log.txt 
sample error
arg 1=1 arg2=2 arg3=3

実行例2:

$ ./wrapper.sh "A B C" D E ; cat error.txt log.txt 
sample error
arg 1=A B C arg2=D arg3=E

ターミナルで出力を表示:

これで、任意のターミナルでファイルへの標準出力と標準エラーの両方をログに記録できるtail -fようになったので、修正tail -f log.txtなどのtail -f log.txt error.txtためにテールがファイルを監視または追跡するように、またはその両方のファイルで実行できます。 テールマンページ

$ tail -f log.txt  error.txt
==> log.txt <==
arg 1=1 arg2=2 arg3=3

==> error.txt <==
sample error

後に追加されるログファイル:

log.txtまたはerror.txtのいずれかが後でプログラムまたはのような別の端末から追加された場合、$ echo "more output" >> log.txt実行中の端末で出力が表示されます$ tail -f log.txt error.txt

==> log.txt <==
more output

さらに、$ echo code red >> error.txt結果は次のとおりです。

==> error.txt <==
code red
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.