質問
raspivid(ラズベリーパイカメラを使って映像を録画するプログラム)というプロセスを終了したいのですが、ダメです。
私はこれをそう呼ぶ:
#!/bin/bash
#Start recording...
raspivid -w 800 -h 600 -t 15000 -o $1 -v -n -rot 270 >> /home/pi/log/camera_output.txt 2>&1 &
#Waiting the video to be complete
sleep 16
#Killing child process
sudo kill -9 $!
#Killing parent process
sudo kill -9 $$
このプロセスを検索してもまだ存在します。
pi@raspberrypi ~ $ ps -ef | grep raspivid
root 7238 7234 0 21:53 ? 00:00:00 [raspivid]
pi 17096 14925 0 22:05 pts/0 00:00:00 grep --color=auto raspivid
殺そうとしても死なない。代わりに親PIDを1に変更します。
pi@raspberrypi ~ $ sudo killall raspivid
pi@raspberrypi ~ $ ps -ef | grep raspivid
root 7238 1 0 21:53 ? 00:00:00 [raspivid]
pi 17196 14925 0 22:05 pts/0 00:00:00 grep --color=auto raspivid
pi@raspberrypi ~ $ sudo killall raspivid
観察結果:
- 通話はしばらく(2時間ほど)うまく機能し、中断し始めました。
- 物理的に電源を切るだけで問題は解決します。ターミナルを介して再起動できません(静止)。
私の質問:
- Linuxが親PIDを1に割り当てるのはなぜですか?
- プロセスを終了できないのはなぜですか? (私もこれを試しました
sudo kill -9 7238
)
編集する:
アイコリーは正しいです。 S列にはDが表示されます。
0 D 0 11823 11819 0 80 0 - 0 down ? 00:00:00 raspivid
ベストアンサー1
ps -el
実行の代わりに実行すると、プロセスステータスを含む列がps -ef
表示されます。S
私の考えでは、プロセスが状態にあるようですD
。つまり、中断なく待つことを意味します。
つまり、プロセスがデバイスドライバの汚れた部分に閉じ込められており、カーネルは、デバイスドライバがプロセスを解放する前にプロセスを終了することは安全ではないと思います。問題のあるNFSサーバーまたは障害のあるデバイスと通信するプロセスでこの現象が発生することがあります。この場合、ビデオキャプチャデバイスと通信しているようです。
残念ながら、システムを再起動することに加えて、D-waitでプロセスを無効にできる魔法の弾丸はありません。truss
プログラムが中断される前に何をしていたのかを調べるためにSolarisコマンドを使用できますが、おそらくこれができることは何もありません。デバイスドライバに欠陥がある可能性があります。
最後に、親プロセスpidが変更された理由は、親プロセスを正常に終了したため1
です。killall
プロセスが終了するたびに、その子プロセスはpid 1によって継承されます。親プロセスの行が.pidと一致しない理由はps -f
少し謎ですgrep
。