Linux通过kill + PID停止后台进程

Linux通过kill + PID停止后台进程

这里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(=发送它SIGSTPSIGSTOP=暂停它(将在外壳中显示为“已停止”)),它不会立即接受任何更多信号(除了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 2545kill -9 2545或任何你喜欢的。

也就是说,如果可以的话,您希望避免使用kill。使用“正确”的方法来终止进程。通常,您可能会丢失某种后台进程的清理功能。但有时也没有其他办法。

相关内容