问题
我想终止一个名为 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)
观察:
我的问题:
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.