问题
我想杀死一个名为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] 举报,一经查实,本站将立刻删除。