コラム

Linuxでコマンドをスケジュールしてみよう(4)atrmコマンドと、atコマンドの出力先の制御

筆者:松澤 ちづる

OS

2016.12.27


前回の Linux でコマンドをスケジュールしてみよう ( 3 ) では、at コマンドでスケジュールされた内容を詳細に確認する方法についてご紹介いたしました。今回は、確認した at コマンドのスケジュールを制御する方法をご紹介したいと思います。


atrmコマンドでジョブを削除する


前回ご紹介したとおり、atq コマンド でいつどのJobID が実行されるか確認したり、at -c JobIDコマンド で内容を確認することができます。

では、これらのコマンドでの確認後、その内容が不要であると判断しました。その実行を取りやめたい場合には、どうすれば良いでしょうか。
その場合には、atrm コマンド を使用して削除します。コマンドは下記の形式になります。

 $ atrm JobID

対象をJobIDで指定しますので、atrmコマンドの前に対象の JobID を把握 しておいてください。
では、下記にその実行例を示します。

$ at now+1hour
at> echo Hello
at> <EOT>
job 1 at Tue Apr 12 13:00:00 2016
$ atq
1    Tue Apr 12 13:00:00 2016 a student 
  
JobID が “1 ” としてスケジュールされていることを確認する

$ at -c 1 | tail
LESSOPEN=¥|¥|/usr/bin/lesspipe.sh¥%s; export LESSOPEN
XDG_RUNTIME_DIR=/run/user/1000; export XDG_RUNTIME_DIR
cd /home/student || {
               echo 'Execution directory inaccessible' >&2
               exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER2feb9714'
echo Hello    
                     <- スケジュールされている内容を確認する

marcinDELIMITER2feb9714
$ atrm 1                               <- “ atrm ”で削除する
$ atq                                    <- “ atq ”で確認しても表示されなくなる
$

atrm コマンドで削除することで、実行される前に取りやめる ことができます。

atコマンドの出力先


前回ご紹介したとおり、at コマンド でコマンドをスケジュールすることができます。

では、そのコマンドが 実行結果を出力するコマンドであった場合、それはどこに出力される のでしょうか。
それはメールで送付 されます。実行結果などの出力はそのユーザ宛にメールで送られてきます。エラーメッセージが生成された場合も同様です。
では、下記にその実行例を示します。

$ at now
at> ls /test
                   <- エラーメッセージが生成されるよう存在しないディレクトリを指定している
at> ls /tmp                     <- 実行結果が生成されるよう存在するディレクトリを指定している
at> <EOT
job 1 at Tue Apr 12 12:00:00 2016

$ mail 
                                <- 送られてきたメールを確認する
...
"/var/spool/mail/student": 1 message 1 new
>N  1 Student User          Tue Apr 12 12:01  18/692   "Output from your job        1"        
& 1
Message  1:
From student@desktop0.example.com  Tue Apr 12 12:01:00 2016
Return-Path:
X-Original-To: student
Delivered-To: student@desktop0.example.com
Subject: Output from your job        1
To: student@desktop0.example.com
Date: Tue, 12 Apr 2016 12:00:59 +0900 (JST)
From: student@desktop0.example.com (Student User)
Status: R


ls /test  にアクセスできません: そのようなファイルやディレクトリはありません  <- "ls /test"のエラーメッセージ

hsperfdata_root                                          <- "ls /tmp"の実行結果
systemd-private-BMHOdA
systemd-private-Xu0N6q


& q

出力先を指定せずにコマンドを実行させると、生成された出力はメールでまとめて送られてきます。
特定のファイルに出力したい場合 には、どうすれば良いでしょうか。それはコマンドを指定する際に、出力先を指定 しておきます。指定は at に関係なく、通常と同じ、>2> などの出力リダイレクションの機能を使用します。

では、下記にその実行例を示します。

$ at now
at> ls /test >test.log 2>&1 
               <- ">"で指定したファイルに出力する
at> ls /tmp >tmp.log 2>&1               
at>EOT
job 2 at Tue Apr 12 12:01:00 2016

$ mail                   <-ファイルにエラーや実行結果が出力されたのでメールは送信されない
No mail for student

$ cat test.log                      <- ">"で指定したファイルにエラーメッセージが出力されている
ls: /test にアクセスできません: そのようなファイルやディレクトリはありません

$ cat tmp.log                       <- ">"で指定したファイルに実行結果が出力されている
hsperfdata_root
systemd-private-BMHOdA
systemd-private-Xu0N6q


コマンド行に出力先を指定することで、特定のファイルに実行結果やエラーメッセージを保存することができます。ファイルだけでなく、端末に出力することもできます。その場合には、>に 端末のデバイスファイル名を指定 してください。

$ tty
/dev/pts/0 
                                                      <- 端末のデバイスファイル名を確認する

$ at now
at> echo "How are you?" > /dev/pts/0   
    <- ">"で指定したデバイス(端末)ファイルに出力する
at> <EOT>

指定したコマンドの出力をファイルにも、メールにも行いたくない場合には、どうすれば良いでしょうか。それにはat コマンドの -M オプションを使用します。-M オプション は、ユーザにメールを送付しない というオプションです。

では、下記にその実行例を示します。

$ at -M now
at> ls /test
                          <- 出力先は指定しない
at> ls /tmp
at> <EOT>
job 3 at Tue Apr 12 12:05:00 2016


$ mail                                 <- メールは送信されない
No mail for student

-Mオプションでメールが送付されなくなります。

指定したコマンドが実行結果など何も出力しない場合でも、あえてメールを生成したい場合 には、どうすれば良いでしょうか。それにはat コマンドの -m オプションを使用 します。
-m オプション は、指定されたコマンドが実行されたときメールを送付 します。

では、下記にその実行例を示します。

$ at now
at> test -d /tmp
                    <- "test -d /tmp"は実行結果を出力しない     
at> <EOT>
 job 4 at Tue Apr 12 13:10:00 2016

$ mail                                      <- 出力がないとメールも生成されない
No mail for student                                       

$ at -m now
at> test -d /test

at> <EOT>
job 5 at Tue Apr 12 13:11:00 2016

$ mail                                 <- 出力がなくてもメールが送付される(ただしメール内容は空)
...
"/var/spool/mail/student": 1 message 1 new
>N  1 Student User          Tue Apr 12 13:11  13/513   "Output from your job        5"
& 1
Message  1:
From student@desktop0.example.com  Tue Apr 12 13:11:22 2016
Return-Path:
X-Original-To: student
Delivered-To: student@desktop0.example.com
Subject: Output from your job        5
To: student@desktop0.example.com
Date: Tue, 12 Apr 2016 13:11:22 +0900 (JST)
From: student@desktop0.example.com (Student User)
Status: R


& q


-m オプションでコマンドなどの出力がない場合でもメールが送付されます。

まとめ


今回も、前前々回前々回前回に引き続き、atコマンドでスケジュールを管理する方法をご紹介しました。これで第 4 回となりました atコマンドですが、他にもたくさんの使い方があります。これらは、また次の機会にご紹介したいと思います。

 

以上、ありがとうございました。

関連URL

筆者紹介

松澤 ちづる

プロフィール

松澤 ちづる( Chizuru Matsuzawa )

RedHatインストラクタ。
担当分野は、RHEL、RHEV、KVM、RedHatSatteliteなど。
RedHatの最上位認定資格RHCA取得。
( Red Hat Certificate of Expertise in Hybrid Cloud Storage,
Deployment and Systems Management, Clustering and Storage Management, Performance Tuning,
SELinux Policy Administration, Directory Services and Authentication, RHCVA, RHCE, RHCSA )


Page Topへ