我正在尝试使用 socat 命令来模拟我的客户端服务和远程主机上的 EMS 代理进程之间的 TCP 断开连接。我正在运行此 socat 命令
socat TCP-LISTEN:8123,fork TCP:远程主机名:端口
我在服务器上运行这个命令服务器1- 我正在配置我的客户端服务以连接到服务器1:8123- 这使得客户端能够连接到实际的 EMS 代理。
但是 - 当我想模拟断开连接时 - 我正在终止 socat 进程(我通过 ps aux | grep socat 找到 pid) - 但这似乎并没有终止连接 - 我可以看到客户端仍然能够与 ems 代理通信。(为什么 socat 在这个阶段没有被杀死?)
但是 - 如果我现在重新启动客户端,那么它将无法连接到代理(因为现在 socat 进程确实已经死了)。
我不知道这里发生了什么——我怎样才能确保 socat 进程肯定被终止了?
答案1
我认为这取决于你如何终止 socat 进程。可能 socat 不接受你使用的信号,请尝试使用 9:
kill -9 pid
ps 的输出应该显示 socat 进程的多个 pid,您必须选择正确的一个。
执行 socat 命令后,您应该只看到一个进程:
[root@centos03 ~]# ps aux | grep socat
root 28801 0.0 0.3 41684 1936 pts/0 S+ 15:22 0:00 socat TCP-LISTEN:8123,fork TCP:web:80
root 28803 0.0 0.1 103244 848 pts/3 S+ 15:22 0:00 grep socat
一旦客户端建立了连接,你就会看到另一个过程:
[root@centos03 ~]# ps aux | grep socat
root 28801 0.0 0.3 41684 1940 pts/0 S+ 15:22 0:00 socat TCP-LISTEN:8123,fork TCP:web:80
root 28807 0.0 0.2 45860 1452 pts/0 S+ 15:25 0:00 socat TCP-LISTEN:8123,fork TCP:web:80
root 28809 0.0 0.1 103244 844 pts/3 S+ 15:26 0:00 grep socat
现在如果你杀死 pid 为 28801 的进程,那么将不允许建立任何新连接,但客户端仍将保持连接,直到你杀死 pid 为 28807 的进程