crontabが面倒な時はatを再帰的に発行


アニメ『STEINS;GATE』(シュタインズゲート)(2011)
タイムリープものって面白いですねえ。引き込まれるアニメでした。残業が多くてゆっくりする時間がないときは、視聴時間が短い理由でアニメを見るのですが、連続で見てしまうので、結局長時間テレビに釘付けです。つい見すぎて朝方になると、ああしまった会社いく時間だ。。orz。昨日の夜にタイムリープしたい気持ちでいっぱいです。

時間を指定してコマンドを実行できるatコマンドを使ってみます。まず出力先を端末ウィンドウにするために、今使用しているttyを調べます。

~$ tty
/dev/pts/0

出力できるか確認します。

~$ echo TESTTEST > /dev/pts/0
TESTTEST
~$ 

現在の時刻を確認します。

~$ date +%T
23:29:16

今23時29分なので、23時30分に、HELLOと表示してみましょう。

~$ at 23:30
warning: commands will be executed using /bin/sh
at> 

at 時間
と入力すると、プロンプトがat>に変わり、コマンドの入力が求められます。
続けて、コマンドを入力します。時間になったら実行したいコマンドです。

at> echo HELLO>/dev/pts/0
at> <EOT>
job 42 at Tue Sep  6 23:30:00 2016

これで、23時30分になったらechoコマンドが実行されます。
では、現在時刻を表示しつつ、コマンドが実行されるのを待ちましょう。

~$ while :;do date +%T;sleep 1;done
23:29:51
23:29:52
23:29:53
23:29:54
23:29:55
23:29:56
23:29:57
23:29:58
23:29:59
HELLO
23:30:00
23:30:01
23:30:02
^C
~$ 

23時30分に、HELLOが表示されましたね。
でも、23:29:59に表示されたのか、23:30:00に表示されたのか微妙ですね。

次は、atコマンドで、時間をbanner表示してみます。

~$ date +%T
23:42:00
~$ at 23:43
warning: commands will be executed using /bin/sh
at> (echo;banner `date +%T`)>/dev/pts/0
at> <EOT>
job 43 at Tue Sep  6 23:43:00 2016
~$ while :;do date +%T;sleep 1;done
23:42:56
23:42:57
23:42:58
23:42:59

 #####   #####     #    #        #####     #      ###     ###
#     # #     #   # #   #    #  #     #   # #    #   #   #   #
      #       #    #    #    #        #    #    # #   # # #   #
 #####   #####          #######  #####          #  #  # #  #  #
#             #    #         #        #    #    #   # # #   # #
#       #     #   # #        #  #     #   # #    #   #   #   #
#######  #####     #         #   #####     #      ###     ###

23:43:00
23:43:01
^C
~$ 

間違いなく23:43ピッタリにコマンドが実行されました。

次は、1分後を指定します。

~$ date +%T
00:06:14
~$ at now + 1min;date +%T
warning: commands will be executed using /bin/sh
at> (echo;banner `date +%T`)>/dev/pts/0
at> <EOT>
job 47 at Wed Sep  7 00:07:00 2016
00:06:31
~$ while :;do date +%T;sleep 1;done
00:06:40
00:06:41
00:06:42
(中略)
00:06:56
00:06:57
00:06:58
00:06:59
00:07:00

  ###     ###      #      ###   #######    #      ###     ###
 #   #   #   #    # #    #   #  #    #    # #    #   #   #   #
# #   # # #   #    #    # #   #     #      #    # #   # # #   #
#  #  # #  #  #         #  #  #    #            #  #  # #  #  #
#   # # #   # #    #    #   # #   #        #    #   # # #   # #
 #   #   #   #    # #    #   #    #       # #    #   #   #   #
  ###     ###      #      ###     #        #      ###     ###

00:07:01
00:07:02
^C
~$ 

1分後と言いましたが、atコマンドで指定できるのは、分単位ですので、1分後を指定すると、1分以内ということになりますね。
at-001

最後に、タイトルにあるように、再帰的にatコマンドを発行し、1分毎にコマンドを実行したいと思います。
crontabの登録が煩わしいとき使います。

~$ echo '(echo;banner `date +%T`)>/dev/pts/0;at now + 1min -f $PWD/a.sh'>a.sh

~$ . a.sh

  ###     ###      #    #        #####     #      ###     ###
 #   #   #   #    # #   #    #  #     #   # #    #   #   #   #
# #   # # #   #    #    #    #  #     #    #    # #   # # #   #
#  #  # #  #  #         #######  ######         #  #  # #  #  #
#   # # #   # #    #         #        #    #    #   # # #   # #
 #   #   #   #    # #        #  #     #   # #    #   #   #   #
  ###     ###      #         #   #####     #      ###     ###

warning: commands will be executed using /bin/sh
job 64 at Wed Sep  7 00:50:00 2016
~$ 
  ###     ###      #    #######   ###      #      ###     ###
 #   #   #   #    # #   #        #   #    # #    #   #   #   #
# #   # # #   #    #    #       # #   #    #    # #   # # #   #
#  #  # #  #  #          #####  #  #  #         #  #  # #  #  #
#   # # #   # #    #          # #   # #    #    #   # # #   # #
 #   #   #   #    # #   #     #  #   #    # #    #   #   #   #
  ###     ###      #     #####    ###      #      ###     ###


  ###     ###      #    #######    #       #      ###     ###
 #   #   #   #    # #   #         ##      # #    #   #   #   #
# #   # # #   #    #    #        # #       #    # #   # # #   #
#  #  # #  #  #          #####     #            #  #  # #  #  #
#   # # #   # #    #          #    #       #    #   # # #   # #
 #   #   #   #    # #   #     #    #      # #    #   #   #   #
  ###     ###      #     #####   #####     #      ###     ###


  ###     ###      #    #######  #####     #      ###     ###
 #   #   #   #    # #   #       #     #   # #    #   #   #   #
# #   # # #   #    #    #             #    #    # #   # # #   #
#  #  # #  #  #          #####   #####          #  #  # #  #  #
#   # # #   # #    #          # #          #    #   # # #   # #
 #   #   #   #    # #   #     # #         # #    #   #   #   #
  ###     ###      #     #####  #######    #      ###     ###

^C
~$ 

停止するには、atqでジョブを確認して、atrmで削除します。

~$ atq
70	Wed Sep  7 00:56:00 2016 a takk
~$ atrm 70
~$ atq
~$ 

atコマンドで、現実の時間も戻ればいいのに。

One response to “crontabが面倒な時はatを再帰的に発行

  1. I’d verunte that this article has saved me more time than any other.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA