質問
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-nonprinting
cat
LFDと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/sh
echo
このフラグをサポートしていない組み込み機能を持つ一部の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