Bashスクリプトファイル名が実行中のプロセスのリストに表示されません。

Bashスクリプトファイル名が実行中のプロセスのリストに表示されません。

私は最近、Linuxを学び、シングルボードコンピュータの世界を探索するためにRaspberry Pi 3を購入しました。私は最新バージョンのRaspbianを実行しています(どのバージョンがわかりません)。

いくつかのチュートリアルビデオを見た後、CPUストレステストを見て、報告された温度を観察することにしました。私が選択した方法は、2つのbashファイル(infinity_loop.bashとcpu_spike.bash)を作成することでした。

Infinite_loop.bashには、大規模な指数計算を実行する無限のwhileループが含まれています。 cpu_spike.bashは、Piの4つのコアで実行するためにInfinite_loop.bashを呼び出します。また、このスクリプトは、所望の期間に5秒ごとにPiの報告された温度を表示します。このスクリプトはうまく動作しますが(すべてのコアが100%に移動し、観察された温度上昇が発生します)、正常に動作しない1つの側面があります。これは、cpu_spikeの終わりにInfinite_loop.bashプロセスを終了しようとすることです。バッシュスクリプト!

ps -A

返される各プロセス名は、「infinite_loop.bash」、「infinite_loop」、または認識可能な名前ではなく「bash」としてリストされます。だから私が従ったサンプルコードでは許可されていませんcpu_spike スクリプトの末尾に次の行があります。

killall infinite_loop.bash

コマンドラインに見つからない 'infinite_loop.bash'プロセスを返します。

したがって、実行中のプロセスのリストで、すべての無限ループプロセスが「bash」と呼ばれることを確認したので、次のように使用しています。

killall bash

テストが終わったら。これは悪くないですか?私の無限ループプロセスがスクリプト名に似た名前で呼び出されないのはなぜですか?

以下の元のcpu_spike.bashコードを参照してください。

#!/bin/bash
#get initial temp
vcgencmd measure_temp
for i in `seq 4` ; do
    #put infinite loop on each cpu
    /bin/bash /home/pi/infinite_loop.bash &
done

#report temp every 5 seconds for 60 seconds
for value in {1..12}
do
    sleep 5s
    vcgencmd measure_temp
done
killall bash

注 - 2つのforループの形式がなぜ異なるのかわかりません。上のループはオンラインで見た例で得られたループであり、2番目のforループは私が見た他の例から得たコードです。

ベストアンサー1

あなたの場合、シェルスクリプトはインタプリタによって解釈されるテキストファイルにすぎないことを覚えておいてくださいbash。したがって、bashスクリプトを実行するすべてのプロセスは、デフォルトでbashコマンドテキストファイルを読み取るインスタンスです。そのため、すべてbashで表示されますps

ソリューションはinfinite_loop.bash、実際にさまざまなスクリプトを実行する方法によって多少異なります。次のようなことをしたとしましょう。

infinite_loop.bash & # cpu 1
infinite_loop.bash & # cpu 2
infinite_loop.bash & # cpu 3
infinite_loop.bash & # cpu 4

最後にを実行して殺すことができますkill $(jobs -p)

おすすめ記事