web-dev-qa-db-ja.com

プロセスを4秒間開始し、その後強制終了するBashスクリプトは機能しません

Firefoxを4秒間起動してから、それを強制終了するスクリプトがあります。 Firefoxはキャプティブポータルに自動的にログインするので、wifiが接続されるとすぐに4秒間開くだけで済みます。私はUbuntu13.04を使用しています。

私の問題は、$ pidが設定されていないことのようです。

firefox ; pid=$!
sleep 4
kill $pid

編集:セットを削除しました、そして今それはkillに無効なpidを与えます。

2

スクリプトは、Firefoxプロセスが終了するまで待機し、その後pid=$!およびその他のコマンドを実行するため機能しません。

やりたいことをする簡単な方法はtimeoutです。

timeout 4s firefox

最初の引数の後に提供されたプログラムを開始し、最初の引数として指定された時間が経過した後にプログラムを停止します。

9
Tim

pid=$!が失敗する理由は、$!バックグラウンドで実行された最後のジョブのPIDであるためです。

つまり、

$ foo & echo $!

fooを開始し、そのプロセスのPIDをエコーし​​ます。

あなたの場合、firefox ; pid=$!firefox & pid=$!に置き換える必要がありますが、firefoxは実際のバイナリをexecするスクリプトであるため、かなり役に立たない可能性があります。

あなたがする必要があるのは、killallを使用することです(これはすべてインスタンスfirefox、あなたまたは他のユーザーを問わず)を殺そうとします)または(コピーして)/usr/bin/firefoxスクリプトを編集して新しいPIDをエコーし​​ます。

1
sds

さらにいくつかの解決策。

  • firefox & sleep 12; kill $!非常に一般的です。どこでも動作するはずです。
  • aptget install timeoutおよびtimeout -k 3m 14s firefox(UbuntuサーバーとFreeBSDサーバーの1つをチェックしました。どちらもデフォルトでインストールされていませんでした)。
  • ここで説明されているようにexpectを使用します: https://unix.stackexchange.com/questions/43340/how-to-introduce-timeout-for-Shell-scripting
  • Perl -e "alarm 10; exec @ARGV" "firefox"
  • $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( 出典と説明
0
Hennes