crontabが現在ログインしているユーザーのセッションと対話するにはどうすればよいですか?

crontabが現在ログインしているユーザーのセッションと対話するにはどうすればよいですか?

質問

Crontabは動作しますが、ユーザーと対話するのではなく、ただそこに座っています。自動認識プロンプト出力でcrontabに現在ログインしているユーザーと会話させるにはどうすればよいですか?たとえば、ユーザー1に1分ごとに鳴るモーニングコール、目覚まし時計、ユーザー1は、コンピュータの前で目と耳を開ける以外に、メッセージを受信するために何もする必要はありませんか?

サイドノート 毎分のタイミング... - もちろん、これは単なる技術的な例であり、実際にはより意味があり便利なタイミングが選択されます。

これを想像してみてください

コンピュータ = オフ

User1 = デイブ

デイブ:


*switching on computer*

*logs into his user account "dave"*

*lands in GUI desktop*

*starts mate-terminal*

誰がログインしているのか、何をしているのかを確認してください。

dave@LocalMachine:~$ w
12:46:42 up  4:22,  2 users,  load average: 0.18, 0.44, 0.43
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
dave   tty7     :0               08:24    4:22m  6:57   0.31s mate-session

/tmp/に実行可能なbashスクリプト "alarm_clock"を生成します。

dave@LocalMachine:~$ emacs -nw /tmp/alarm_clock && chmod +x /tmp/alarm_clock
#    Alarm clock displaying current time and ringing.
#
#    Copyleft 

答え1

^G特徴

まず、これを行うと、echo '\a'着信音を受信する端末でベルが鳴ります。 8進値が007のASCIIコード。これはCTRL + G(`^ G)を押すのと同じです。

man 7 asciiから:

       Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
       ────────────────────────────────────────────────────────────────────────
       000   0     00    NUL '\0' (null character)   100   64    40    @
       001   1     01    SOH (start of heading)      101   65    41    A
       002   2     02    STX (start of text)         102   66    42    B
       003   3     03    ETX (end of text)           103   67    43    C
       004   4     04    EOT (end of transmission)   104   68    44    D
       005   5     05    ENQ (enquiry)               105   69    45    E
       006   6     06    ACK (acknowledge)           106   70    46    F
       007   7     07    BEL '\a' (bell)             107   71    47    G

通常、この文字は見えません。

$ echo -e "$(date) \a"
Tue Jan  2 18:31:38 IST 2024 

しかし、コマンドに/フラグを追加すると-vこれを見ることができます(--show-nonprintingcatLFDとTABを除いて、^とM-表記法を使用します。):

$ echo -e "$(date) \a" |cat -v
Tue Jan  2 18:31:40 IST 2024 ^G

したがって、このASCIIコードを(ターミナルではなく)ファイルに書き込むときは、8進数の007文字の値をファイルに書き込むだけです。 「ピ」音が聞こえるのは、端末に書くときだけです。

-e未使用echo

スクリプトのもう1つの問題は、#!Shebang()で始まるのではなく、コメントで始まるということです。この場合は#!/bin/bash無視され、スクリプトがによって実行される可能性があります/bin/sh。バラよりman 5 crontab

いくつかの環境変数はcron(8)デーモンによって自動的に設定されます。 SHELLが/bin/shに設定されている[...]

/bin/shechoこのフラグをサポートしていない組み込み機能を持つ一部のPOSIX準拠シェルがシステムに存在する可能性があります-e(POSIXはこのフラグを定義せず、通常は拡張のみです)。この場合、-eエコーしたい文字列の一部として使用されます。ぜひ使用したい方bashはコメントに移してください後ろにシェルボーン。

また、この場合はを使用する方が良いですprintf。たとえば、次のようになります。printf "$(date) \a\n"

実際の端末にメッセージを送信する

私たちが言ったように、ファイルに書き込むときは、端末と対話せずにファイルにいくつかの文字を書き込むだけです。端末にメッセージを送信するには、次を使用することをお勧めします。write(1)、ユーザーの最後のアクティブなttyにメッセージを送信します。たとえば、

printf "$(date)\a\n" | write <USER>

この場合、ユーザーはアクティブシェルから次のメッセージを受け取ります。

Message from root@locahost on pts/0 at 19:00 ...
Tue Jan  2 19:00:49 IST 2024 
EOF

または、すべてのユーザーと端末にメッセージを送信するには、次のようにします。wall(1)

printf "$(date)\a\n" | wall

関連情報