shellだけで非同期処理を行えるか?
どうやら、wait というコマンドと trap というコマンドがあるらしい。
- 端末のシェル(bash,dash,zsh,csh系)におけるwaitコマンドについて - 試験運用中なLinux備忘録
- 【 trap 】 システム割り込み時の処理を設定する | 日経 xTECH(クロステック)
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起動時に実行されるようにしておけばできるはず。動作確認していないけれども。