Linuxでこのプロセスを強制終了できないのはなぜですか?


8

問題

raspivid(Raspberry Piカメラを使用してビデオを記録するプログラム)と呼ばれるプロセスを強制終了したいのですが...

これは私がそれを呼ぶ方法です:

#!/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

観察:

  1. コールはしばらくの間(2時間程度)正常に機能し、その後ハングし始めます。
  2. 物理的な電源オフのみが問題を解決します。端末から再起動できません(ハングします)

私の質問:

  1. Linuxが親PIDを1に割り当てるのはなぜですか?
  2. なぜプロセスは殺されないのですか?(私も試しましたsudo kill -9 7238

回答:


2

問題

コマンドが原因で、スクリプトがおそらくゾンビを作成していkill -9ます。jjlinの回答からも示唆されているように、強制されずに突然プロセスを強制終了することは、決して良い習慣ではありません。

からman bash読むことができます:

<defunct>とマークされたプロセスは、親が適切に破棄していないために残っているデッドプロセス(いわゆる「ゾンビ」)です。親プロセスが終了すると、これらのプロセスはinit(8)によって破棄されます。

#1の回答:プロセスのinit持つPID 1と、このLinux用は、(それがに割り当てるので、それらをPID 1を持つ親を割り当てINIT)。

#2の回答:彼らは殺されることができないだけで、彼らはちょうどなので、死んだ ...彼らの親がされている場合init、おそらくいくつかの時間を待つために十分です。

システムからゾンビを削除するには、SIGCHLDシグナルをkillコマンドを使用して手動で親に送信できます。親プロセスがゾンビの取得を拒否する場合、次のステップは親プロセスを削除することです。プロセスが親を失うと、initは新しい親になります。Initは定期的にwaitシステムコールを実行し、initを親としてゾンビを刈り取ります。[1]

念のためにこのアイデアは、1日または別の発生する:#kill -9 initroot権限を持つプロセス物理的に電力網からコンピュータを抜いへのソフトウェアと同等です。[:-)]

ただし、ゾンビプロセスpsSTAT列に「Z」が存在することにより、コマンドの出力で識別できます。次の行を使用して、それらを簡単に識別できます

ps -aux | grep Z

Linuxゾンビの世界に関する参考資料:


親PID 1のプロセスはゾンビではありません。プロセスは、がそれより前に強制終了されると、この親を取得します。だから彼killallは明らかに彼を望んだプロセスではなく親を殺している。
Barmar 2015

<defunct>彼のps出力のどこを見ますか?それはこの質問とどう関係しているのですか?
Barmar 2015

@Barmar見なかった。残念ながら、常に問題があなたが探している場所にあるとは限りません。ところでから$!kill -9の後に...カメラとバックグラウンド・プロセスを待たずにsleep 16、彼の親が突然再び、。それは.zombieのにおいがしました ...におい(:-))に続いて、次のように、彼がしたことで、子供はまだ生きていますが、親は殺されました(-9)。kill -9ps -ef
Hastur 2015

1
孤立プロセスとゾンビプロセスを混同していると思いますが、それらは無関係です。
Barmar 2015

スクリプトをもう一度見てみましょう。彼kill -9は独自のプロセスを実行しています。効果的でない呼び出しの後、それがkillされ、<defunct> ...であると想定するのは合理的sudo killall raspividです。raspivid孤立したままの独自の子プロセスを生成することも可能です。ところで、 "ps -aux | grep Z"を実行して、ゾンビかどうかを確認するだけで十分kill -9です。メインスクリプトのプロセスを回避するには(十分)です。
Hastur 2015

4

質問番号1に答えるには:

プロセスが子プロセスを生成すると、子はそれぞれ独自のPIDを持ちます。各子のPPID(親のプロセスID)は、親プロセスのPIDです。親が死んだ場合、子プロセスは孤立します。孤立したプロセスは、PIDが1のシステム初期化プロセスによって自動的にピックアップされます。


0

プログラムはおそらくカメラデバイスを開いており、強制的に強制終了したため、適切にクリーンアップできなかったため、スタックしました。

いくつかの観察:

  • 何をしているのかわからない場合を除いて、-9からプログラムを強制終了することは、一般的にお勧めできません。通常のkill(オプションなし)で十分です。
  • スクリプトを殺す必要はまったくありません。-t 15000ビデオの長さを指定するためにすでにプログラムに渡したので、最初のキルは不要です。スクリプトの最後に到達するとシェルが自動的に終了するため、2回目の強制終了も不要です。プログラムが(本来の状態で)自動的に終了しない場合は、他の問題があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.