Cron Bashスクリプト - /var/spool/mail/rootの代わりに現在の端末にエコーされます。

Cron Bashスクリプト - /var/spool/mail/rootの代わりに現在の端末にエコーされます。

Cron Bashスクリプトは/var/spool/mail/rootの代わりに現在のセッション端末にエコーできますか?

ログファイルにエラーを記録するスクリプトがありますが、補足/重要ではない情報が端末に反映されます。

cron から root でスクリプトを実行すると、メッセージは端末ではなく /var/spool/mail/root にリダイレクトされます。

ストレージの代わりにrootまたは他のユーザーがログインしている場合は、端末に表示するようにしたいと思います。誰もログインしていないときにこれらのメッセージが消えても大丈夫です。 Cisco IOS と同様

答え1

で実行すると、「現在の端末」はありませんcron

デフォルトでは、cronジョブ出力を含む電子メールが送信されます。ローカルメールサブシステムはそれをファイルに転送します。このファイルは、またはお気に入りのローカル電子メールクライアントを/var/spool/mail/$USER使用して読み取ることができます。mailmailx

cron次のように、ジョブの出力をホームディレクトリのファイルに書き込むことができない特別な理由はありません。

* * * * *    date >$HOME/.current_date 2>&1

GUIを実行している場合は、GUIを使用してnotify-send画面のポップアップにメッセージを書き込むことができます。しかし、それを作成するのは簡単ではありませんcron。一つある探すStackExchange周辺解決策このサブ質問に。

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

答え2

あなたはそれを使用することができます書く特定のログインユーザーにテキストを送信するユーティリティです。

command that produces output | write root

このマニュアルでは、以下をさらに説明します。

複数回ログインしたユーザーに書き込むには、ターミナルパラメータを使用して書き込むターミナルを指定できます。そうでなければ、受信者の端末が実装定義の方法で選択され、情報メッセージが送信者の標準出力に書き込まれる。どの端末が選択されたかを表示します。

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

関連情報