別の(フォアグラウンド)プロセスが完了したらプロセスを強制終了できるように、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 -p
BASH 2.05スクリプトで動作させるには何をする必要がありますか、それとも別の方法がありますか?
変数から固定数を引くだけだと考えられましたが$!
、それが良いアイデアかどうかはわかりません...
編集:
パイプ内の最初のプログラムを強制終了したい理由は、パイプ内で後続するすべてのプログラムが、特にgzip
出力ストリームを閉じるという素晴らしい仕事をするからです。