这里https://unix.stackexchange.com/a/104825/109539man说要停止后台进程必须使用kill + PID。但是我无法使用kill + PID停止后台进程,只能使用kill + JOB ID
[KPE@home Temp]$ jobs
[KPE@home Temp]$ ps
PID TTY TIME CMD
13270 pts/0 00:00:00 bash
23257 pts/0 00:00:00 ps
[KPE@home Temp]$ mc &
[1] 23258
[KPE@home Temp]$ ps
PID TTY TIME CMD
13270 pts/0 00:00:00 bash
23258 pts/0 00:00:00 bash
23262 pts/0 00:00:00 mc
23264 pts/0 00:00:00 ps
[1]+ Stopped . /usr/libexec/mc/mc-wrapper.sh
[KPE@home Temp]$ kill -s 15 23262
[KPE@home Temp]$ ps
PID TTY TIME CMD
13270 pts/0 00:00:00 bash
23258 pts/0 00:00:00 bash
23262 pts/0 00:00:00 mc
23266 pts/0 00:00:00 ps
[KPE@home Temp]$ kill %1
[1]+ Terminated . /usr/libexec/mc/mc-wrapper.sh
[KPE@home Temp]$ ps
PID TTY TIME CMD
13270 pts/0 00:00:00 bash
23267 pts/0 00:00:00 ps
[KPE@home Temp]$
所以问题是如何通过 pid 杀死来停止 bg 进程
答案1
如果您的C-Z
程序mc
(=发送它SIGSTP
或SIGSTOP
=暂停它(将在外壳中显示为“已停止”)),它不会立即接受任何更多信号(除了SIGKILL
,但使用该信号并不是很好)直到恢复。一旦您使用 恢复它SIGCONT
,它将接受您的SIGTERM
信号(以及在暂停时排队等待的信号)。
kill -CONT $!; kill -TERM $! # $! refers to the pid of the last-spawned job
kill %1
之所以有效,是因为 shell 的内置功能kill
可能会在幕后执行这两个步骤。
答案2
首先获取pid
ps aux | grep process_name
为我工作
您应该得到如下输出:
root 2545 0.0 0.0 85128 3128 ? Ss Apr19 0:07 /usr/sbin/apache2 -k start
www-data 2569 0.0 0.0 2011388 10132 ? Sl Apr19 1:19 /usr/sbin/apache2 -k start
www-data 2570 0.0 0.0 2011380 10108 ? Sl Apr19 1:22 /usr/sbin/apache2 -k start
coteyr 23344 0.0 0.0 11748 928 pts/3 S+ 10:12 0:00 grep --colour=auto apache
然后你可以kill 2545
或kill -9 2545
或任何你喜欢的。
也就是说,如果可以的话,您希望避免使用kill。使用“正确”的方法来终止进程。通常,您可能会丢失某种后台进程的清理功能。但有时也没有其他办法。