微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 为什么我不能杀掉这个进程?

问题

我想杀死一个名为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

观察:

>通话工作正常(2小时或某事),然后开始
挂.
>只有物理断电才能解决问题.我无法重启
终端(也挂了)

我的问题:

>为什么Linux将父PID分配给1?
>为什么这个过程不能被杀死? (我也试过sudo kill -9 7238)

编辑:

aecolley是对的.列S显示D:

0 D     0 11823 11819  0  80   0 -     0 down   ?        00:00:00 raspivid

解决方法:

如果你运行ps -el而不是ps -ef,你将得到一个带有进程状态的S列.我的猜测是该过程处于状态D,这意味着不间断的等待.

换句话说,进程被卡在设备驱动程序的较脏部分中,并且内核认为杀死它是不安全的,直到设备驱动程序放弃它为止.您有时会看到与生病的NFS服务器或有错误的设备通信的进程.在这种情况下,它看起来像是在与视频捕捉设备交谈.

不幸的是,除了重新启动系统之外,没有银弹可以从D-wait中取消进程.您可以尝试使用Solaris命令truss来查找程序在卡住之前所执行的操作,但可能没有任何关于它的操作.你可能只有一个有缺陷的设备驱动程序.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐