私は自分の使用のためにbashスクリプトを作成しています。20秒など、特定の時間コマンドを実行してコマンドを終了するにはどうすればよいですか?私は多くの解決策を試しましたが、何も機能せず、タイムアウトコマンドも試しましたが成功しませんでした。これに対する解決策をいくつか教えてください。
例:10秒後にスクリプトとターミナルでこのコマンドを実行したい
some command
私は自分の使用のためにbashスクリプトを作成しています。20秒など、特定の時間コマンドを実行してコマンドを終了するにはどうすればよいですか?私は多くの解決策を試しましたが、何も機能せず、タイムアウトコマンドも試しましたが成功しませんでした。これに対する解決策をいくつか教えてください。
例:10秒後にスクリプトとターミナルでこのコマンドを実行したい
some command
回答:
うーん、それはトリックを行う必要があります:
xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave
xmessage
ここで簡単なテストケースを提供します(あなたの場合、airodumpコマンドはそこに行く必要があります)。&
バックグラウンドに入れます。
$!
最後に開始されたプロセスのPIDを保持します(例:https : //stackoverflow.com/a/1822042/2037712を参照)。PIDは変数に保存されますpidsave
。
しばらく待ってから(sleep
)、TERM
プロセスにシグナルを送信します。
some command > logfile &
は、最初の行で使用します。その後、分析できますlogfile
。
bashプロンプトから使用できます」
your_command & sleep 20; kill $!
aptget install timeout
、timeout -k 3m 14s your_command
expect
、ここで説明されているように使用します:https : //unix.stackexchange.com/questions/43340/how-to-introduce-timeout-for-shell-scriptingperl -e "alarm 10; exec @ARGV" "Your_command"
$COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID
(
ソースと説明)別の方法は、pgrep $ patternまたはpkill $ patternを使用することです。指定されたパターンに一致するすべてのPIDを返し、マシンで実行中のすべてのプロセスを調べます。したがって、PIDの範囲を自分が所有するものだけに制限するには、pgrep -P $ mypid $ patternまたはpkill -P $ mypid $ patternを使用します
したがって、バックグラウンドプロセスを一定時間実行するには、スクリプトは次のようになります。
#!/bin/bash
mypid=$$
run_something &
sleep $time_in_seconds
pkill -P $mypid something
これにより、現在の親PIDの下で実行されている同じ名前パターンを持つすべてのプロセスが強制終了されることに注意してください。したがって、これを使用して複数のプロセスを開始し、一定時間後にそれらをすべて同時に終了することができます。