Как остановить процесс выполнения в Linux

У меня есть файл сценария pingIP.sh, который просто пингует данный IP-адрес,

ping -c 70 74.125.228.71 

Проблема в том, что когда я пытаюсь остановить исполняемый скрипт посередине, он не останавливает его должным образом.

Использование linux cmd ps -ef|grep pingIP |grep -v 'grep pingIP' Я могу получить идентификатор процесса и убить его с помощью 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 даже после остановки выполнения файла сценария?

Если вы хотите убить процесс оболочки и любой другой процесс, который он породил, лучше всего, вероятно, начать новую группу процессов ( setpgid() в дочернем setpgid() после fork() перед запуском execve() в скрипте) и убить группа процессов с kill(-pid) где pid – возвращаемое значение fork() в родительском.

Если вызов setpgid() не является опцией, вы все равно можете сделать это так:

Вместо:

 run("your-script its args"); 

Делать:

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

Как правило, Ctrl+C на вызывающей оболочке / убивает процесс из родительского процесса, отправляя сигнал через Process.destroy() (Java).

pkill инструментом для таких задач является pkill , который может убивать процессы по шаблону, например

 pkill ping 

Обратите внимание, что обычный пользователь не может убивать другие процессы пользователей, поэтому убедитесь, что вы вошли на правильный компьютер с правильным идентификатором пользователя.

Бонусный совет: используйте pgrep -fl ping чтобы просмотреть соответствующие процессы, чтобы убедиться, что вы хотите их убить – потому что он выполняется как root, pkill ssh также убьет ваш sshd и может заблокировать вас. Поэтому, в частности, при запуске от имени root, которого вы должны избегать, дважды проверьте с помощью pgrep .

Используйте killall. Напр. "killall scriptname". killall убивает процесс по имени. Кроме того, вы также можете генерировать сигнал типа. SIGKILL, SIGSTOP и т. Д.

Получить идентификатор процесса, который вы написали:

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

а затем убить процесс детей, используя

 pkill -P process-id