私は最近、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)
。
答え2
bashを呼び出し、解釈のためにInfinite_loop.bashスクリプトの引数として提供します。したがって、実行中のプロセスを呼び出します。bash
プロセス名をyoursに指定するには、infinite_loop.bash
次のように変更してlaunxhiningスクリプトを編集します。
/bin/bash /home/pi/infinite_loop.bash
入力する:
/home/pi/infinite_loop.bash
(bashによって実行されるようにスクリプトのようなshebangの最初の行があることを確認してください)
これはこの名前で表示されます。