試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

sleepコマンドについての覚え書き

引数について

sleepコマンドは、引数に指定した秒数、停止して待つのだが、その引数は

  • 後ろに「m」(分)、「h」(時間)、「d」(日)を付けることができるので、秒以外の指定もできる。「s」で秒指定もできるが、デフォルトなので省略可。
  • 引数は複数付けることができ、その合計時間sleepする
  • 更に、小数を使った書き方ができる

といった指定ができ、

$ sleep 105
$ sleep 1m 45s
$ sleep 1.75m

のいずれも、1分45秒待つ処理になる。

サスペンド状態に関する実験

$ sleep 5 && zenity --info || zenity --error

を実行させ、5秒経過させると情報ダイアログが出るが、5秒以内にCtrl+Zを押すと、その時点でエラーダイアログが出る。

$ sleep 5; zenity --info

とした場合、5秒経過させると情報ダイアログが出るのは同じだが、5秒以内にCtrl+Zを押すと、その時点で情報ダイアログが出る。

$ (sleep 5 && zenity --info || zenity --error)

のように、かっこで囲むと、5秒以内にCtrl+Zを押した場合、処理全体に対してサスペンドされ、エラーダイアログは出ない。
コマンドを実行して(Enterを押したとき)から5秒が経過する前にfgでフォアグラウンドに戻すと、sleepコマンド実行の5秒後になるまで停止を続けた後、情報ダイアログが出る。もし、5秒以上経過したあとにfgをした場合、すぐに情報ダイアログが出てくる。いずれにしても、エラーダイアログば出ない。
sleepコマンドは、サスペンドさせても、カウント処理は続いていて、サスペンドによって、後ろの命令の実行を遅らせることはしないという性質があるが、fgbgを実行させない限りは止まったまま。
なお、

$ (sleep 5; zenity --info)

を実行しても上と同様の結果となる。

かたまりのバックグラウンド実行と、sleep後の処理のキャンセルについて

$ (sleep 30; zenity --info) &
[1] xxxxx(プロセスID)

として、このかたまりをバックグラウンドで実行させると、30秒後に情報ダイアログが出る。
もし、sleepの後ろの処理を全てキャンセルしたいのであれば、ジョブ番号(上の例では「[1] ...」と出てきているので1番)指定でkillする(「%」の後ろにこの数字を続けて書いて指定する)。

$ kill %1
[1]+  終了しました      ( sleep 30; zenity --info )