web-dev-qa-db-ja.com

CronBashスクリプト-/ var / pool / mail / rootの代わりに現在の端末にエコーします

Cron Bashスクリプトが/ var/spool/mail/rootの代わりに現在のセッションターミナルにエコーすることは可能ですか?

ログファイルにエラーを書き込むスクリプトがありますが、補足的/重要でない情報がターミナルにエコーアウトされます。

Cronでrootとしてスクリプトを実行すると、メッセージがターミナルではなく/ var/pool/mail/rootにリダイレクトされます。

Rootまたは他のユーザーが保存されるのではなくログインしている場合、それらをターミナルに表示したいと思います。誰もログインしていないときにこれらのメッセージが失われた場合は問題ありません。 CiscoIOSのように

1
ZZ9

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
1
Mark Plotnick

cronから実行する場合、「現在の端末」はありません。

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

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
2
roaima