Shammer's Philosophy

My private adversaria

shellだけで非同期処理を行えるか?

どうやら、wait というコマンドと trap というコマンドがあるらしい。

wait使用例

指定したPIDが終了するまで待つ、というように使用できるらしい。が、単体では使用できない(というか用途が思い浮かばない)。スクリプトの中で組み込むことで意味のある何かをできそうだ。

#!/bin/bash
do_something &
wait $!
result=`get_result_of_do_something`
echo $result

まあ、あくまでも例ではあるが、do_something をするとダイアログが開いて何か入力させるとか、そういうことができる。他の例としては、ループの中で一定時間 sleep して、sleep 後に特定のファイルなどをチェック、条件を満たせばループを抜けて他の処理をするとか、次にやる trap と組み合わせる方法などが考えられる。

trap使用例

特定のシグナルを待って、そのシグナルを受信したときに指定したコマンドを実行する、というもの。これもこれだけではあまり意味のある使い方はできなそうだ。スクリプトの中で定義してそのスクリプトを起動、そのスクリプトが何らかのシグナルを受信したときに、指定した任意のコマンドを実行する、というようなものだろうか。あるプロセスの終了と同時に何かをやりたい、というような場合が考えられる。

$ trap 'echo OK' 2
$ 
$ <!-- ここで Ctrl-C -->
$ OK

$ 

Terminal の起動時に何かをして、終了時にその何かをリセットする、みたいなこともできそうだ。

#!/bin/bash
function initial_action {
  // any actions
}
function close_action {
  // any actions
}
initial_action
trap 'close_action' 1 2 15

これを任意の名前で保存して実行権限を付与し、$HOME/.bashrc に書いてTerminal起動時に実行されるようにしておけばできるはず。動作確認していないけれども。