3

別の(フォアグラウンド)プロセスが完了したらプロセスを強制終了できるように、BASHスクリプトでパイプデータ収集コマンドのPIDを取得しようとしています。データ収集コマンドでタイムアウトが発生しましたが、どのくらいの時間が必要かは事前にわかりません。数分から数時間まで。

この質問パイプラインでプロセスのPIDを取得する方法は有益でしたが、うまくいきませんでした。おそらく私がBASH2.05(組み込みシステム上)を使用しているためです。

コマンドのコマンドラインでの最初のテストjobs -pは有望に見えました。実際には、ksmon以下のコマンドをパイプコマンド(ksmon | {various filters} | gzip -c > file)に置き換えて、 " $!" BASH変数が、強制ksmon終了しようとしているプログラムではなく、パイプ内の最後のプロセスを提供するようにします。

Test:/ $  ksmon > /dev/null & jobs -p
[1] 2016
2016
Test:/ $  ps | grep ksmon
 2016 root        660 S   ksmon
 2018 root        580 S   grep ksmon
Test:/ $  kill $(jobs -p)
[1]+  Terminated              ksmon >/dev/null
Test:/ $  ps | grep ksmon
 2021 root        580 S   grep ksmon
Test:/ $

うわぁ!だから私はそれをスクリプトに入れようとしました:

Test:/ $  cat > test.sh << EOF
> #!/bin/bash
> # That's bash 2.05
> ksmon > /dev/null & jobs -p
> EOF
Test:/ $  chmod 755 test.sh
Test:/ $  ./test.sh
Test:/ $
Test:/ $  # Nothing ...
Test:/ $  ps | grep ksmon
 2025 root        660 S   ksmon
 2027 root        580 S   grep ksmon
Test:/ $  jobs -p
Test:/ $

これは私がそれを動作させようとしているバージョンです:

Test:/ $  bash --version
GNU bash, version 2.05.0(2)-release (arm-Artila-linux-gnu)
Copyright 2000 Free Software Foundation, Inc.

奇妙なことに、上記のスクリプトはUbuntuホストで機能します。

jobs -pBASH 2.05スクリプトで動作させるには何をする必要がありますか、それとも別の方法がありますか?

変数から固定数を引くだけだと考えられましたが$!、それが良いアイデアかどうかはわかりません...

編集: パイプ内の最初のプログラムを強制終了したい理由は、パイプ内で後続するすべてのプログラムが、特にgzip出力ストリームを閉じるという素晴らしい仕事をするからです。

4

1 に答える 1

2

$を使用することをお勧めします!パイプ内の最後のプロセスのPIDを取得します。次に、lsofを使用して、/ procからファイル記述子を開くことにより、チェーン内の以前のプロセスを順番に判別します

于 2012-09-03T12:49:10.653 に答える