pkill не может убивать процессы с родительским идентификатором процесса 1

Я хочу убить следующие процессы, используя

pkill "run_tcp_sender.sh" 

или

 pkill -SIGKILL "run_tcp_sender.sh" root 14320 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22 root 14323 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22 root 14325 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22 root 14327 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22 root 14328 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22 root 14330 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22 

но бесполезно, что процессы остаются там, что не так с моей командой?

BTW: Я могу использовать следующую команду для достижения того, что хочу

 kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}') 

  • как убить процессы dovecot
  • Что делать, если «kill -9» не работает?
  • Как я могу автоматически убить процесс с максимальной загрузкой процессора?
  • D state process kill
  • Как убить (последний - 1) PID с помощью bash
  • Как убить процесс с помощью одной команды?
  • Как запустить telnet через SSH?
  • Как я могу убить процесс с учетом его «команды»?
  • 3 Solutions collect form web for “pkill не может убивать процессы с родительским идентификатором процесса 1”

    pkill по умолчанию посылает сигнал SIGTERM для остановки процессов. Вот список сигналов, которые вы можете отправить. Вы можете отправить их по имени или номеру:

     $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX 

    Поэтому вы отправляете сигнал № 15. Если процессы не отвечают на этот сигнал, вам может понадобиться использовать сигнал № 9, pkill -SIGKILL .

    На странице man pkill :

    -сигнала

      Defines the signal to send to each matched process. Either the numeric or the symbolic signal name can be used. (pkill only.) 

    Проблемы с pkill

    ОП упомянул, что ему не удалось получить pkill -SIGKILL "run_tcp" для работы. Первоначально мы думали, что проблема связана с pkill потенциально убивающим себя, прежде чем она закончит уничтожение всех процессов «run_tcp».

    Но это было трудно принять, учитывая ноту на странице pkill man:

    Выполненный процесс pgrep или pkill никогда не будет сообщать о себе как о совпадении.

    В дополнение к этому, @Gilles оставил комментарий, в основном говорящий то же самое, что pkill просто не убивает себя. Затем он дал нам довольно большой ключ к тому, что происходит на самом деле.

    Вот пример, который демонстрирует, что отсутствовали OP и я:

    шаг 1 – создать скрипт sleepy.bash

     #!/bin/bash sleep 10000 

    шаг 2 – загрузить некоторые поддельные задачи сна

     $ for i in `seq 1 5`;do bash sleepy.bash & done [1] 12703 [2] 12704 [3] 12705 [4] 12706 [5] 12707 

    шаг 3 – проверить выполняемые задачи

     $ ps -eaf|egrep "sleep 10000|sleepy" saml 12703 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash saml 12704 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash saml 12705 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash saml 12706 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash saml 12707 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash saml 12708 12704 0 21:48 pts/16 00:00:00 sleep 10000 saml 12709 12707 0 21:48 pts/16 00:00:00 sleep 10000 saml 12710 12705 0 21:48 pts/16 00:00:00 sleep 10000 saml 12711 12703 0 21:48 pts/16 00:00:00 sleep 10000 saml 12712 12706 0 21:48 pts/16 00:00:00 sleep 10000 

    Шаг 4 – попробуйте использовать мой pkill

     $ pkill -SIGTERM sleepy.bash 

    шаг 5 – что случилось?

    Выполняя команду ps сверху, мы видим, что ни один из процессов не был убит, как проблема OP. Что происходит?

    Оказывается, это проблема в том, как мы пытались использовать pkill . Команда:

     pkill -SIGTERM "sleepy.bash" 

    искал процесс под названием «sleepy.bash» . Ну нет никаких процессов с этим именем. Однако есть процессы, которые называются «bash sleepy.bash» . Таким образом, pkill искал процессы, чтобы убивать, а не находить, а затем выходить.

    Поэтому, если мы слегка подкорректируем pkill мы используем это:

     $ pkill -SIGTERM -f "sleepy.bash" [1] Terminated bash sleepy.bash [2] Terminated bash sleepy.bash [3] Terminated bash sleepy.bash [4]- Terminated bash sleepy.bash [5]+ Terminated bash sleepy.bash 

    Теперь мы получаем эффект, который мы ищем. Какая разница? Мы использовали ключ -f для pkill который заставляет pkill использовать весь путь к командной строке при сопоставлении с именем процесса.

    с страницы pkill man

     -f The pattern is normally only matched against the process name. When -f is set, the full command line is used. 

    Альтернативные методы

    убить, ps

    Этот метод довольно многословный, но выполняет и работу:

     kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}') 

    pgrep w / pkill & killall

    Вы можете использовать либо pgrep для подачи списка PID для pkill либо вместо этого использовать killall .

    Примеры

     # pgrep solution $ pgrep "run_tcp" | pkill -SIGKILL # killall killall -SIGKILL -r run_tcp 

    Рекомендации

    • pgrep man page
    • Персональная страница pkill
    • Страница убийства

    Это не связано с идентификатором родительского процесса. Проблема в том, что вы убиваете все процессы, выполняющие run_tcp_sender.sh , но у вас нет таких процессов – процессы, которые вас интересуют, запускают bash .

    Вы можете дать pkill соответствовать всей командной строке:

     pkill -f '^bash run_tcp_sender.sh' 

    Другим подходом было бы уничтожить все процессы, открытые скриптом. Это может привести к сопутствующему ущербу, например редактору, который только что открыл скрипт.

     fuser -k /path/to/run_tcp_sender.sh 

    Пока вы не редактируете скрипт как root, уничтожение только корневых процессов решит эту проблему:

     kill $(lsof -uroot /path/to/run_tcp_sender.sh) 

    Попробуйте убить процесс с помощью «сигнала 9», я имею в виду использование

     kill -9 PID 

    обычно сигнал 9 не рекомендуется для блокировки базы данных

    если процесс остается в памяти, некоторые потери ввода / вывода или процесс ожидают завершения ввода / вывода

    Interesting Posts

    Как разрешить «Нет протокола» для пользователя su

    Linux Mint – сбой в экране Запись видеофайлов

    cp говорит, что он удаляет файлы, но не должен

    Отредактированный файл после вызова `sudo visudo`

    Выборочно копировать из коллекции удаленных каталогов

    Разверните размер раздела подкачки

    Переменная структура скрипта

    Почему объединение этих двух буферов дает эту ошибку?

    Что такое высокая память и низкая память в Linux?

    Программа оболочки, которая считывает строки и выходные строки с номерами строк

    Смонтируйте и скопируйте / var в хранилище экземпляров EC2 во время первой загрузки

    Как получить udev для идентификации устройства USB, независимо от того, какой USB-порт подключен?

    Могу ли я восстановить имена файлов из отказавшего RAID0 (Linux Debian 5.0.8)

    Печать только git commit sha и шаблон с помощью sed

    Нужно ли монтировать / загружаться на отдельный первичный раздел?

    Linux и Unix - лучшая ОС в мире.