Я пытаюсь использовать команду socat для имитации отключения tcp между моей клиентской службой и процессом брокера EMS на удаленном хосте. Я запускаю эту команду socat
socat TCP-LISTEN:8123,fork TCP:имя удаленного хоста:порт
Я запускаю эту команду на сервере, скажемсервер1- и я настраиваю свою клиентскую службу для подключения ксервер1:8123- что позволяет клиенту подключаться к реальному брокеру EMS.
Однако, когда я хочу смоделировать отключение, я завершаю процесс socat (pid я нахожу с помощью ps aux | grep socat), но это, похоже, не завершает соединение, я вижу, что клиент все еще может взаимодействовать с брокером ems. (почему socat не завершается на этом этапе?)
Однако если я сейчас перезапущу свой клиент, то он не сможет подключиться к брокеру (потому что теперь процесс socat действительно мертв).
Я не могу понять, что здесь происходит. Как мне убедиться, что процесс socat определенно завершен?
решение1
Я думаю, это зависит от того, как вы убиваете процесс socat. Вероятно, socat не принимает сигнал, который вы используете, попробуйте с 9:
kill -9 pid
Вывод ps должен отображать более одного pid для процесса socat, вам нужно выбрать правильный.
Сразу после выполнения команды 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.