特定の時間のBash Runコマンド?


12

私は自分の使用のためにbashスクリプトを作成しています。20秒など、特定の時間コマンドを実行してコマンドを終了するにはどうすればよいですか?私は多くの解決策を試しましたが、何も機能せず、タイムアウトコマンドも試しましたが成功しませんでした。これに対する解決策をいくつか教えてください。

例:10秒後にスクリプトとターミナルでこのコマンドを実行したい

some command

回答:


14

うーん、それはトリックを行う必要があります:

xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave

xmessageここで簡単なテストケースを提供します(あなたの場合、airodumpコマンドはそこに行く必要があります)。&バックグラウンドに入れます。

$!最後に開始されたプロセスのPIDを保持します(例:https : //stackoverflow.com/a/1822042/2037712を参照)。PIDは変数に保存されますpidsave

しばらく待ってから(sleep)、TERMプロセスにシグナルを送信します。


相棒に感謝しますが、今は1つの問題があります。コマンドで作成された出力を見たいのですが、xmessageウィンドウには何も表示されません。
Umairリアズ

@UmairRiaz:xmessageは単なる例です。質問の例を修正し、コマンドの出力をログに記録するにsome command > logfile &は、最初の行で使用します。その後、分析できますlogfile
mpy

4

bashプロンプトから使用できます」

  • your_command & sleep 20; kill $!
  • または、timeoutコマンドを使用します。たとえばaptget install timeouttimeout -k 3m 14s your_command
  • またはexpect、ここで説明されているように使用します:https : //unix.stackexchange.com/questions/43340/how-to-introduce-timeout-for-shell-scripting
  • またはperlでそれを行います: perl -e "alarm 10; exec @ARGV" "Your_command"
  • :またはこのもっと不可解なソリューションを使用$COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPIDソースと説明

1

別の方法は、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の下で実行されている同じ名前パターンを持つすべてのプロセスが強制終了されることに注意してください。したがって、これを使用して複数のプロセスを開始し、一定時間後にそれらをすべて同時に終了することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.