我原本期望在下面的第三条命令中看不到任何内容,但显然我的期望是错误的。为什么?
$ sudo fuser -v /dev/snd/*
USER PID ACCESS COMMAND
/dev/snd/controlC0: joeuser 2339 F.... pulseaudio
/dev/snd/controlC2: joeuser 2339 F.... pulseaudio
/dev/snd/pcmC0D7p: joeuser 2339 F...m pulseaudio
/dev/snd/pcmC2D0c: joeuser 2339 F...m pulseaudio
/dev/snd/pcmC2D0p: joeuser 2339 F...m pulseaudio
$ kill 2339
$ sudo fuser -v /dev/snd/*
USER PID ACCESS COMMAND
/dev/snd/controlC0: joeuser 2339 F.... pulseaudio
/dev/snd/controlC2: joeuser 2339 F.... pulseaudio
/dev/snd/pcmC0D7p: joeuser 2339 F...m pulseaudio
/dev/snd/pcmC2D0c: joeuser 2339 F...m pulseaudio
/dev/snd/pcmC2D0p: joeuser 2339 F...m pulseaudio
答案1
kill 命令只是向进程发送一个信号,而默认信号(当您没有选择信号时)会被进程捕获,并可能被忽略或以其他方式处理。使用信号 -9 (不可屏蔽信号)可以不雅地终止进程。您可以查看进程的任何文档,以找到一个信号来告诉进程清理并终止,但 -9 是通常的“直接终止”方法。
kill -9 2339
应该杀死它,因为你拥有该进程。或者从信号名称(来自 kill -l 的列表)
kill SIGKILL 2339
答案2
虽然使用 -9 (SIGKILL) 可以终止进程,但这不是我的首选。当我不确定要终止哪些进程时,我会按以下顺序连续终止进程:
- kill -15 (SIGTERM),这是您不提供信号编号时提供的默认信号。程序是应该处理此信号并正常退出。有些则不这样做。
- kill -2 (SIGINT) 是当您输入 CTRL-C 来中断程序时程序将收到的信号。一些没有 tty 的程序仍会处理此问题。
- kill -1 (SIGHUP) 是当您注销终端并且 tty 消失时进程获得的信号。这由更多程序处理。
- kill -9 (SIGKILL) 是您最后的手段,因为它无法处理。如果您的程序以非规范模式使用终端,则不会重置您的终端,因此您的命令行可能会被搞砸。一个简单的“stty sane ^j”(control-j 执行直接 LF)应该可以修复它。
并非所有程序都能正确处理信号,有些程序会处理某些信号,但不会处理其他信号。我发现这种方式是最安全的。