Cron Bashスクリプトが/ var/spool/mail/rootの代わりに現在のセッションターミナルにエコーすることは可能ですか?
ログファイルにエラーを書き込むスクリプトがありますが、補足的/重要でない情報がターミナルにエコーアウトされます。
Cronでrootとしてスクリプトを実行すると、メッセージがターミナルではなく/ var/pool/mail/rootにリダイレクトされます。
Rootまたは他のユーザーが保存されるのではなくログインしている場合、それらをターミナルに表示したいと思います。誰もログインしていないときにこれらのメッセージが失われた場合は問題ありません。 CiscoIOSのように
write ユーティリティを使用して、特定のログインユーザーにテキストを送信できます。
command that produces output | write root
ドキュメントはさらに説明します:
複数回ログインしているユーザーに書き込むには、terminal引数を使用して、書き込む端末を指定できます。それ以外の場合は、受信者の端末が実装定義の方法で選択され、どの端末が選択されたかを示す情報メッセージが送信者の標準出力に書き込まれます。
Red Hat/CentOSでは、実装で定義された方法は、アイドル時間が最も短い端末を選択することです。
ログインしている可能性のある複数のユーザーの1人に書き込みを許可したい場合は、次のようにすることができます。
for u in root alice bob charlie
do
if users|grep -w -q $u
then
user=$u
break
fi
done
if test -n "$user"
then
command that produces output | write $user
fi
cron
から実行する場合、「現在の端末」はありません。
デフォルトでは、cron
はジョブからの出力を含む電子メールを送信します。ローカルメールサブシステムはそれをファイル/var/spool/mail/$USER
に配信し、mail
、mailx
、またはお好みのローカルメールクライアントを使用して読み取ることができます。
cron
ジョブを取得して、その出力をホームディレクトリ内のファイルに書き込めなかった理由は特にありません。たとえば、次のようになります。
* * * * * date >$HOME/.current_date 2>&1
GUIを実行している場合は、notify-send
を使用して、画面のポップアップにメッセージを書き込むことができます。しかし、これをcron
から行うのは簡単ではありません。このサブ問題に対して solutions のStackExchangeの周りに search を設定します。
Ttyに書き込みたい場合は、実際にecho hello, world >/dev/tty1
のようなものを使用できます。書き込みを行う前に、正しいアカウントが実際に/dev/tty1
にログオンしていることを確認することをお勧めします(これは、デバイスの所有権stat -c %U /dev/tty1
を確認することで実行できます)。
#!/bin/bash
#
me=roaima # userid to write messages to
log()
{
local tty owner
for tty in $( who | awk -v me="$me" '$1 == me {print $2}' )
do
owner="$( stat -c %U "/dev/$tty" 2>/dev/null )"
[[ "$me" = "$owner" ]] && echo "$@" >"/dev/$tty"
done
}
# ...
log "hello, world"
log "this is a message for you to read RIGHT NOW"
exit 0
ただし、write
コマンドを使用した方がよい場合があります。たとえば、ログインした端末でユーザー「roaima」に書き込むには、次のようにします。
* * * * * echo hello from cron | write roaima >/dev/null 2>&1