Linux のヒント: スケジュール・ジョブの持続時間をコントロールする

一定時間後にジョブを停止する方法

例えば皆さんが、真夜中に 30 分間、いくつかのトレースを実行することで面倒な問題をデバッグしなければならない、あるいは単純に、Linux システムを目覚まし時計として使いたいとしましょう。このヒントは、cronat の機能を使って開始したジョブを、一定時間実行した後に、あるいは他の判断基準を満たした時に、停止する方法について説明します。このヒントは AppleTalk ネットワーキング・パッケージ (Netatalk) での timeout コマンドに関する情報を含むように変更されました (編集者より)。

Ian Shields (ishields@us.ibm.com), Senior programmer, IBM

Ian ShieldsIan Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士と博士を取得しています。


developerWorks 貢献著者レベル

2007年 8月 02日 (初版 2007年 7月 31日)

Linux® システムと UNIX® システムでは、将来のジョブを、1 度のみ、もしくは繰り返し実行されるようにスケジュールすることができます。最近 developerWorks に公開された別の記事「Linux のヒント: cron と at を使ったジョブ・スケジューリング」を読んだ読者の 1 人が、ラジオやテレビのプログラムを録音または録画し、そのプログラムが終了したら停止するようにしたいと希望しました。そのことから私は、Alsace-Lorraine で非常に優れた車を作ったイタリア人、Ettore Bugatti を思い出しました。ある顧客が、他の自動車メーカーが油圧ブレーキに切り替えたずっと後になっても彼がケーブル動作のブレーキを使い続けている理由を尋ねたところ、Bugatti は「お客様、私は走るための車を作っており、止まるための車は作っておりません」と答えたというのです。この記事では、皆さんのジョブ・スケジューリングにブレーキを追加する方法についてのヒントを紹介します。

「Linux のヒント」シリーズの他の記事

これまでに紹介したヒントは以下の通りです。

もし皆さんが求めている話題がない場合には、このページを評価する際に、その旨をお知らせください。できるだけ皆さんのご期待に沿うようにしたいと思います。

一定時間後、あるいは他の判断基準が満たされた後にジョブを終了するためには、通常は 1 つのプロセスがそのジョブを実行し、別のプロセスが完了の判断基準をモニターします。今回のヒントでは、実際のジョブの実行中にプロセスに時間を管理させる方法を学びます。また、一方のタスクが早く終了してしまったときに、もう一方のタスクをシグナル機能とトラップ機能を使って終了させる方法についても学びます。

タイマー・プロセス

シェル・スクリプトの中で時間に関わる動作をさせるための基本的なツールは、sleep コマンドです。sleep コマンドは、実行中のシェルの動作を、指定された期間停止させます。デフォルトでは停止時間を秒数で指定しますが、s (秒)、m (分)、h (時間) を時間値に付けて指定することもできます。これによってそのシェルの実行が中断されるため、実際の作業は別のシェルで実行する必要があります。これを実現するには、& 文字を使ってそのタスクをバックグラウンドに置きます。

まず、あるコマンドを 10 分間実行したいとします。リスト 1 は、指定された期間だけ xclock コマンドを実行しようとする場合の bash シェル・スクリプトの例を表しています。これを皆さんのシステムで試してみてください。

リスト 1. runclock1.sh を使った最初の試み
#!/bin/bash
runtime=${1:-10m}
# Run xclock in background
xclock&
#Sleep for the specified time.
sleep $runtime
echo "All done"

すると、図 1 のような時計が表示されるはずです。

図 1. 単純な xclock
単純な xclock

この方法で唯一の問題点は、スクリプトは停止しても時計は停止しなかったことです。


親と子、そして孤児

リスト 2 は、機能を強化した runclock2.sh スクリプトを示しています。このスクリプトは、シェルのプロセス ID と xclock プロセスに関する情報を、スクリプトの出力と ps コマンドの出力と共にキャプチャーし、シェルが終了した後に xclock のプロセスの状態を表示します。

リスト 2. 診断情報を収集する runclock2.sh
[ian@attic4 ~]$ cat runclock2.sh
#!/bin/bash
runtime=${1:-10m}
mypid=$$
# Run xclock in background
xclock&
clockpid=$!
echo "My PID=$mypid. Clock's PID=$clockpid"
ps -f $clockpid
#Sleep for the specified time.
sleep $runtime
echo "All done"
[ian@attic4 ~]$ ./runclock2.sh 10s
My PID=8619. Clock's PID=8620
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
ian       8620  8619  0 19:57 pts/1    S+     0:00 xclock
All done
[ian@attic4 ~]$ ps -f 8620
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
ian       8620     1  0 19:57 pts/1    S      0:00 xclock

ps の最初の出力で親プロセスの ID (PPID) が 8619 であり、これがスクリプトのプロセス ID (PID) であることに注目してください。いったんスクリプトが終了すると、クロック・プロセスは孤児となり、init プロセスの子プロセス (プロセス 1) として割り当てられます。この子プロセスは親プロセスが終了してもすぐには終了せず、ユーザーがシステムからログアウトすると終了します。


子プロセスを終了する

子プロセスが終了しない問題を解決するためには、これらのプロセスを kill コマンドを使って明示的に終了します。これによってプロセスにシグナルが送られ、通常はこれでプロセスが終了します。このヒントの後の方で、シグナルをトラップしても終了はしないプロセスを説明しますが、ここでは割り込みシグナル (SIGINT) を使って時計を終了します。

システムで使用できるシグナルのリストを見るためには、-l オプションを付けたkill コマンドを使います (リスト 3)。一部のシグナルはすべての Linux システムに共通ですが、一部は特定のマシン・アーキテクチャー専用かもしれないことに注意してください。浮動小数点例外シグナル (SIGFPE) あるいはセグメント違反シグナル (SIGSEGV) など、一部はシステムによって生成されますが、割り込みシグナル (SIGINT) やユーザー定義シグナル (SIGUSR1 あるいは SIGUSR2)、あるいは強制終了シグナル (SIGKILL) はアプリケーションによって送信されます。

リスト 3. Fedora Core 5 システムでのシグナル
[ian@attic4 ~]$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

リスト 2 で、$!というシェル変数を使って xclock プロセスの PID をキャプチャーしたことを思い出してください。リスト 4 は、この情報を使って xclock プロセスに終了シグナル (SIGTERM) を送信し、xclock プロセスを終了する方法を示しています。

リスト 4. runclock3.sh を使って子プロセスを終了する
[ian@attic4 ~]$ cat ./runclock3.sh
#!/bin/bash
runtime=${1:-10m}
mypid=$$
# Run xclock in background
xclock&
clockpid=$!
echo "My PID=$mypid. Clock's PID=$clockpid"
ps -f $clockpid
#Sleep for the specified time.
sleep $runtime
kill -s SIGTERM $clockpid
echo "All done"

リスト 5 は、runclock3.sh を実行したときに何が起こるかを示しています。最後の kill コマンドは、xclock プロセス (PID 9285) が実際に終了していることを確認しています。

リスト 5. 子プロセスの終了を検証する
[ian@attic4 ~]$ ./runclock3.sh 5s
My PID=9284. Clock's PID=9285
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
ian       9285  9284  0 22:14 pts/1    S+     0:00 xclock
All done
[ian@attic4 ~]$ kill -0 9285
bash: kill: (9285) - No such process

シグナルの指定を省略すると、SIGTERM がデフォルトのシグナルになります。シグナル名の SIG 部分はオプションです。-s とシグナル名を使う代わりに、単純にシグナルの番号の前に接頭辞 a を付けることもできます。つまりリスト 6 に示す 4 つの形式は、どれも 9285というプロセスを強制終了する等価な方法です。上記のリスト 4 に使われている特別な値 -0 は、シグナルをプロセスに送信できるかどうかをテストします。

リスト 6. kill コマンドを使ってシグナルを指定する方法
kill -s SIGTERM 9285
kill -s TERM 9285
kill -15 9285
kill 9285

ここで見たような、アプリケーションを駆動するための単なるワンショット・タイマーが必要なのであれば、AppleTalk ネットワーキング・パッケージ (Netatalk) の一部である timeout コマンドを検討する価値があります。大部分のインストールではこのパッケージが自動的には含まれないので timeout コマンドを使う場合、このパッケージをインストールする必要があるかもしれません (インストールの詳細は下記の「参考文献」を参照してください)。


他の終了条件

これで、一定期間プロセスを実行するための基本的なツールは入手できました。シグナルの処理についての詳細に入る前に、他の終了要件の処理方法を考えてみましょう。例えば、決められた期間に情報を繰り返しキャプチャーしたり、ファイルが一定のサイズになったら終了したり、あるいはファイルが特定の文字列を含んだら終了するための方法を考えます。この種の作業は、forwhileuntil などのループを使って処理するのが一番です。そして sleep コマンドによって提供される組み込みの遅延を使って繰り返しループを実行します。1 秒よりも細かな精度が必要な場合には、usleep コマンドを使うこともできます。

時計に秒針を追加したり、また時計の色をカスタマイズしたりすることができます。利用できる色の名前を調べるためには showrgb コマンドを使います。例えば、xclock -bg Thistle -update 1& というコマンドを使ったとすると、秒針を持ち、背景がアザミ (Thistle) 色の時計が起動します。

今度はこれまで学んだこととループを使って時計の画像を毎秒キャプチャーし、それらの画像を組み合わせて GIF 画像のアニメーションを作ります。リスト 7 は、xwininfo コマンドを使って xclock コマンドのウィンドウ ID を見つける方法を示しています。次に ImageMagick コマドライン・ツールを使って 1 秒間隔で時計の画像を 60 個キャプチャーします (ImageMagick の詳細は「参考文献」を参照)。そして最後にこれらを組み合わせると、元々の時計の 50% の大きさで無限にループするアニメーションの GIF ファイルができます。

リスト 7. 1 秒間隔で画像をキャプチャーする
[ian@attic4 ~]$ cat getclock.sh
#!/bin/bash
windowid=$(xwininfo -name "xclock"| grep '"xclock"' | awk '{ print $4 }')
sleep 5
for n in `seq 10 69`; do
  import -frame  -window $windowid clock$n.gif&
  sleep 1s
#  usleep 998000
done
convert -resize 50% -loop 0 -delay 100 clock?[0-9].gif clocktick.gif
[ian@attic4 ~]$ ./getclock.sh
[ian@attic4 ~]$ file clocktick.gif
clocktick.gif: GIF image data, version 89a, 87 x 96

この種の時間動作には、必ず多少の変動があります。そこで、時計の画像を取得するための import コマンドをバックグラウンドで実行し、メインのシェルが正確に時間を計れるようにしてあります。それでも、バックグラウンド処理用に各サブシェルを起動するたびにある程度時間がかかるため、いくらかドリフトが発生する可能性があります。この例では、シェル・スクリプトが起動してから時計をクリックしてフォアグラウンドにするための時間を考慮して、起動時に 5 秒間の遅延も組み込んであります。こうした細工があるにもかかわらず、私が何回か実行したところ、クロック・ティックを読み損なってしまい、最初のクロック・ティックを余分にコピーしたことが 1 度ありました。これは、このスクリプトの実行に 60 秒をほんの少し超える時間がかかったためです。この問題を回避するための 1 つの方法は、スクリプトのコメント行に示すように、usleep コマンドを使ってオーバーヘッドに見合うだけの (1 秒よりも少ない) 何マイクロ秒かを指定する方法です。すべてが計画通りに進めば、出力される画像は図 2 のようなものになるはずです。

図 2. xclock が動く様子
xclock が動く様子

この例は、あるシステム条件のスナップショットを一定間隔で一定回数取る方法を示しています。ここで説明した方法を使うことで、他の条件のスナップショットも取ることができます。出力ファイルのサイズをチェックして一定の制限を超えないようにしたり、あるいはファイルが一定のメッセージを含むかどうかをチェックしたり、あるいは vmstat などのコマンドを使ってシステムの状態をチェックすることもできます。皆さんのニーズと想像力に応じて、無限の応用が可能です。


シグナルとトラップ

リスト 7 の getclock.sh スクリプトを実行し、スクリプトの実行中に時計のウィンドウを閉じると、スクリプトは実行を続けますが、時計のウィンドウのスナップショットを取ろうとするたびにエラー・メッセージを出力します。同様に、リスト 4 の runclock3.sh スクリプトを実行し、スクリプトが実行しているターミナル・ウィンドウで Ctrl-c を押すと、スクリプトはこの時計をシャットダウンせずに即座に終了します。これらの問題を解決するには、「子プロセスを終了する」で説明したシグナルのいくつかを、スクリプトがキャッチできる、つまりトラップできる必要があります。

バックグラウンドで runclock3.sh を実行し、その実行中に ps -f コマンドを実行すると、リスト 8 のような出力が表示されます。

リスト 8. unclock3.sh のプロセス情報
[ian@attic4 ~]$ ./runclock3.sh 20s&
[1] 10101
[ian@attic4 ~]$ My PID=10101. Clock's PID=10102
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
ian      10102 10101  0 06:37 pts/1    S      0:00 xclock
ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
ian       4598 12455  0 Jul29 pts/1    00:00:00 bash
ian      10101  4598  0 06:37 pts/1    00:00:00 /bin/bash ./runclock3.sh 20s
ian      10102 10101  0 06:37 pts/1    00:00:00 xclock
ian      10104 10101  0 06:37 pts/1    00:00:00 sleep 20s
ian      10105  4598  0 06:37 pts/1    00:00:00 ps -f
[ian@attic4 ~]$ All done

[1]+  Done                    ./runclock3.sh 20s

ps -f の出力には、runclock3.sh プロセス (PID 10101) に関連した 3 つのエントリーがあることに注目してください。特に、sleep コマンドが別のプロセスとして実行しています。早期に終了した xclock プロセスを処理したり、あるいは実行中のスクリプトを Ctrl-c を使って終了したりするための 1 つの方法としては、これらのシグナルをキャッチし、そして kill コマンドを使って sleep コマンドを強制終了します。

sleep コマンドのプロセスを判断するタスクを実現するためには、多くの方法があります。リスト 9 は、私達のスクリプトの最新版、 runclock4.sh を示しています。下記の点に注意してください。

  • sleep コマンドは明示的にバックグラウンドで実行されています。
  • sleep コマンドの終了を待つために wait コマンドが使われています。
  • 最初の trap コマンドによって、SIGCHLD、SIGINT、あるいは SIGTERM の各シグナルが受信されるたびに stopsleep 関数が実行されます。パラメーターとしてスリーパー・プロセスの PID が渡されます。
  • シグナルの結果として stopsleep 関数が実行されます。stopsleep 関数はステータス・メッセージを出力し、sleep コマンドに SIGINT シグナルを送ります。
  • 何らかの理由で sleep コマンドが終了すると、wait コマンドが満足されます。するとトラップがクリアーされ、そして xclock コマンドが終了します。
リスト 9. runclock4.sh でシグナルをトラップする
[ian@attic4 ~]$ cat runclock4.sh
#!/bin/bash

stopsleep() {
  sleeppid=$1
  echo "$(date +'%T') Awaken $sleeppid!"
  kill -s SIGINT $sleeppid >/dev/null 2>&1
}

runtime=${1:-10m}
mypid=$$
# Enable immediate notification of SIGCHLD
set -bm
# Run xclock in background
xclock&
clockpid=$!
#Sleep for the specified time.
sleep $runtime&
sleeppid=$!
echo "$(date +'%T') My PID=$mypid. Clock's PID=$clockpid sleep PID=$sleeppid"
# Set a trap
trap 'stopsleep $sleeppid' CHLD INT TERM
# Wait for sleeper to awaken
wait $sleeppid
# Disable traps
trap SIGCHLD
trap SIGINT
trap SIGTERM
# Clean up child (if still running)
echo "$(date +'%T') terminating"
kill -s SIGTERM $clockpid >/dev/null 2>&1 && echo "$(date +'%T') Stopping $clockpid"
echo "$(date +'%T') All done"

リスト 10 は、runclock4.sh を 3 回実行した出力を示しています。1 回目は、すべてのものが自然に終了するまで実行されます。2 回目は xclock が早期に終了します。そして 3 回目にはシェル・スクリプトが Ctrl-c によって中断されます。

リスト 10. さまざまな方法で runclock4.sh を停止する
[ian@attic4 ~]$ ./runclock4.sh 20s
09:09:39 My PID=11637. Clock's PID=11638 sleep PID=11639
09:09:59 Awaken 11639!
09:09:59 terminating
09:09:59 Stopping 11638
09:09:59 All done
[ian@attic4 ~]$ ./runclock4.sh 20s
09:10:08 My PID=11648. Clock's PID=11649 sleep PID=11650
09:10:12 Awaken 11650!
09:10:12 Awaken 11650!
[2]+  Interrupt               sleep $runtime
09:10:12 terminating
09:10:12 All done
[ian@attic4 ~]$ ./runclock4.sh 20s
09:10:19 My PID=11659. Clock's PID=11660 sleep PID=11661
09:10:22 Awaken 11661!
09:10:22 Awaken 11661!
09:10:22 Awaken 11661!
[2]+  Interrupt               sleep $runtime
09:10:22 terminating
09:10:22 Stopping 11660
./runclock4.sh: line 31: 11660 Terminated              xclock
09:10:22 All done

「Awaken」メッセージからわかるように、stopsleep 関数が何回も呼び出されていることに注目してください。この理由がわからない場合には、キャッチする割り込みのタイプごとにこの関数の別コピーを作り、何によって余分に関数が呼び出されているのかを調べます。

また、xclock コマンドが終了したことを伝えるいくつかのジョブ制御メッセージが出力され、sleep コマンドに割り込んでいることにも注目してください。デフォルトの bashのターミナル設定を使ってバックグラウンドでジョブを実行すると、bash は通常 SIGCHLD シグナルをキャッチし、次のターミナル出力行が出力された後にメッセージを出力します。スクリプトの set -bm コマンドは、SIGCHLD シグナルを即座にレポートするように、そしてジョブ制御モニターを有効にするように bash に命令します。次のセクションの目覚まし時計の例では、これらのメッセージを表示させないための方法を説明します。


目覚まし時計

最後の演習では、この記事を書く動機となった元々の問題、つまりラジオのプログラムを録音する方法に戻ります。実際には目覚まし時計を作成します。読者の提案する使い方でラジオのプログラムを録音することが法律的に許されるのであれば、目覚まし時計の代わりに、vsound のようなプログラムを追加してレコーダーを作成することができます。

この演習では、GNOME の rhythmbox アプリケーションを使って、いくつかのポイントを追加で説明します。この説明は、他のメディア・プレーヤーを使う場合にも有効です。

この目覚まし時計は、皆さんがお持ちの CD や MP3 ファイルの再生をはじめとし、皆さんが望むどんな音でも出すことができます。ノースキャロライナ州の中部では、24 時間クラシック音楽を放送しているラジオ局、WCPE があります。WCPE は放送の他に、Ogg Vorbis など何種類ものフォーマットでインターネットにストリームも流しています。皆さんが何か他のものを好むのであれば、別のストリーミング・ソースを選ぶこともできます。

WCPE の Ogg Vorbis ストリームを再生する X Windows のターミナル・セッションから rhythmbox を起動するには、リスト 11 に示すコマンドを使います。

リスト 11. WCPE の Ogg Vorbis ストリームで rhythmbox を起動する
rhythmbox --play http://audio-ogg.ibiblio.org:8000/wcpe.ogg

rhythmbox で興味深い点の第 1 は、実行中のプログラムが、終了用のコマンドを含めて、コマンドに応答できることです。そのため、プログラムを終了するために kill コマンドを使う必要はありませんが、使いたければ使うこともできます。

興味深い点の 2 番目は、(先ほどの例で使用した時計のように) 大部分のメディア・プレーヤーではグラフィカルな表示が必要なことです。通常は、ユーザーがマシンの前にいない場合のある時点で、cronat の機能を使ってコマンドを実行します。そのため通常の前提では、これらのスケジュール・ジョブは表示にアクセスしません。しかし rhythmbox コマンドを使うと、使いたい表示を指定することができます。たとえ画面がロックされていても、こうしたバリエーションを実際に試すことができますが、そのためにはおそらくログオンしている必要があります。リスト 12 は、この目覚まし時計のベースに使用する alarmclock.sh スクリプトを示しています。このスクリプトは、実行時間の長さを指定する 1 つのパラメーターをとり、デフォルトは 1 時間です。

リスト 12. 目覚まし時計 alarmclock.sh
[ian@attic4 ~]$ cat alarmclock.sh
#!/bin/bash

cleanup () {
  mypid=$1
  echo "$(date +'%T') Finding child pids"
  ps -eo ppid=,pid=,cmd= --no-heading | grep "^ *$mypid"
  ps $playerpid >/dev/null 2>&1 && {
    echo "$(date +'%T') Killing rhythmbox";
    rhythmbox --display :0.0 -quit;
    echo "$(date +'%T') Killing rhythmbox done";
  }
}

stopsleep() {
  sleeppid=$1
  echo "$(date +'%T') stopping $sleeppid"
  set +bm
  kill $sleeppid >/dev/null 2>&1
}

runtime=${1:-1h}
mypid=$$
set -bm
rhythmbox --display :0.0 --play http://audio-ogg.ibiblio.org:8000/wcpe.ogg&
playerpid=$!
sleep $runtime& >/dev/null 2>&1
sleeppid=$!
echo "$(date +'%T') mypid=$mypid player pid=$playerpid sleeppid=$sleeppid"
trap 'stopsleep $sleeppid' CHLD INT TERM
wait $sleeppid
echo "$(date +'%T') terminating"
trap SIGCHLD
trap SIGINT
trap SIGTERM
cleanup $mypid final
wait

stopsleep 関数の中で set +bm を使うことでジョブ・コントロール設定をリセットし、先ほどrunclock4.shで見たメッセージを表示させないようにしていることに注目してください。

リスト 13 は crontab の一例を示しています。この crontab は、平日 (月曜日から金曜日まで) は毎日午前 6 時から午前 7 時まで、毎週土曜日は午前 7 時から 2 時間、そして毎週日曜日は午前 8 時半から 1 時間半、この目覚まし時計を実行します。

リスト 13. 目覚まし時計を実行する crontab の例
0 6 * * 1-6 /home/ian/alarmclock.sh 1h
0 7 * * 7 /home/ian/alarmclock.sh 2h
30 8 * * 0 /home/ian/alarmclock.sh 90m

新しい目覚まし時計用に独自の crontab を設定する方法については、以前のヒント、「cron と at を使ったジョブ・スケジューリング」を参照してください。

もっと複雑なタスクでは、いくつかの子プロセスがあるかもしれません。クリーンアップ・ルーチンは、ps コマンドを使ってスクリプト・プロセスの子プロセスを見つける方法を示しています。この考え方を拡張して任意の子プロセスのセットをループして、それぞれの子プロセスを終了することができます。


詳しく学ぶには

Linux での管理タスクについて詳しく知りたい場合には、チュートリアル「LPI exam 102 prep: Administrative tasks」を読むか、あるいは下記の「参考文献」を参照してください。また、この記事を評価することも忘れないでください。そして、他にどんなヒントを知りたいかもお知らせください。

参考文献

学ぶために

製品や技術を入手するために

  • IBM trial softwareを使って皆さんの次期 Linux 開発プロジェクトを構築してください。 developerWorks から直接ダウンロードすることができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, AIX and UNIX, Open source
ArticleID=257944
ArticleTitle=Linux のヒント: スケジュール・ジョブの持続時間をコントロールする
publish-date=08022007