我有一个脚本文件 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)
pid
fork()
如果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