为什么我不能杀死这个进程?

4 linux bash process

问题

我想终止一个名为 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 $$
Run Code Online (Sandbox Code Playgroud)

如果我搜索这个过程,它仍然存在:

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
Run Code Online (Sandbox Code Playgroud)

如果我试图杀死它,它不会死。相反,它将父 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
Run Code Online (Sandbox Code Playgroud)

观察:

  1. 通话可以正常工作一段时间(2 小时左右),然后开始挂起。
  2. 只有物理关机才能解决问题。我无法通过终端重启(它也挂了)

我的问题:

  1. 为什么 Linux 将父 PID 分配为 1?
  2. 为什么进程不能被杀死?(我也试过sudo kill -9 7238

编辑:

aecolley 是对的。S 列显示 D:

0 D     0 11823 11819  0  80   0 -     0 down   ?        00:00:00 raspivid
Run Code Online (Sandbox Code Playgroud)

aec*_*ley 10

如果您运行ps -el而不是ps -ef,您将获得一个S包含进程状态的列。我的猜测是进程处于 state D,这意味着不间断的等待。

换句话说,进程被困在设备驱动程序的混乱部分,内核认为在设备驱动程序放开它之前杀死它是不安全的。您有时会在与故障 NFS 服务器或出现错误的设备通信的进程中看到这种情况。在这种情况下,它看起来像是在与视频捕获设备通话。

不幸的是,除了重新启动系统之外,没有灵丹妙药的方法可以从 D-wait 中取消进程。您可以尝试使用 Solaris 命令truss找出程序在卡住之前做了什么,但您可能对此无能为力。您可能只有一个有问题的设备驱动程序。

最后,父 pid 更改为的原因1是您killall成功终止了父进程。每当一个进程退出时,它的子进程都由 pid 1 继承。为什么ps -f父进程的行与grep.

  • 问题是关于 Linux,所以 `strace` 在 Linux 上相当于 Unix 上的 `truss`。 (2认同)