Linux中如何停止正在执行的进程

Linux中如何停止正在执行的进程

我有一个脚本文件 pingIP.sh 它只是 ping 给定的 IP 地址,

ping -c 70 74.125.228.71

问题是当我尝试在中间停止执行的脚本时,它没有正确停止它。

使用 linux cmdps -ef|grep pingIP |grep -v 'grep pingIP'我能够获取进程 ID,并使用 cmd 杀死它kill -9 processid

例如,执行脚本文件

PING 74.125.228.71 (74.125.228.71) 56(84) bytes of data.
64 bytes from 74.125.228.71: icmp_seq=1 ttl=122 time=256 ms
64 bytes from 74.125.228.71: icmp_seq=2 ttl=122 time=244 ms
64 bytes from 74.125.228.71: icmp_seq=3 ttl=122 time=250 ms
64 bytes from 74.125.228.71: icmp_seq=4 ttl=122 time=254 ms
64 bytes from 74.125.228.71: icmp_seq=5 ttl=122 time=243 ms

现在执行kill命令只会停止脚本执行,但 ping 响应将继续,直到达到指定的 ping 计数。

有什么建议可以在停止执行脚本文件后避免 ping 执行吗?

答案1

通常,我们会在调用 shell 时通过(Java)Ctrl+C发送信号来终止父进程中的进程。Process.destroy()

完成此类任务的一个巧妙工具是pkill,它可以通过某种模式终止进程,例如

pkill ping

请注意,普通用户可能不会终止其他用户的进程,因此请确保您使用正确的用户 ID 登录到正确的计算机。

额外提示:用于pgrep -fl ping列出匹配的进程,以确保您想要杀死所有进程 - 因为以 root 身份运行pkill ssh杀死你sshd并可能将你锁在门外。因此,特别是当以 root 身份运行时(无论如何你都应该避免这种情况)请仔细检查pgrep.

答案2

如果您想终止 shell 进程及其生成的任何其他进程,最好是启动一个新的进程组(在运行脚本setpgid()之前的子进程中),并终止该进程组,其中返回值是在父级中。fork()execve()kill(-pid)pidfork()

如果setpgid()无法拨打电话,您仍然可以这样做:

代替:

run("your-script its args");

做:

run("set -m; trap 'kill %' TERM; your-script its args & wait")

答案3

使用杀戮。对于前。 “killall 脚本名”。 Killall 按名称杀死进程。此外,您还可以发出类似的信号。 SIGKILL、SIGSTOP 等

答案4

获取您所写的进程 ID:

ps -ef|grep pingIP |grep -v 'grep pingIP'

然后使用杀死子进程

pkill -P process-id

相关内容