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

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

pkill "run_tcp_sender.sh" 

или

  • Как я могу получить полный список процессов в Solaris без усеченных линий?
  • Как установить переменную процесса для Linux?
  • Найти и убить процесс, который использует последовательный порт
  • Получить PID приложения, запущенного в эмуляторе активного терминала
  • Каковы различия между KILL, SUSPEND и TERMINATE процесса
  • Захват полной структуры процесса / стека
  •  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}') 

  • Какое состояние (состояния) процесса пересчитывается на время процессора?
  • Как я могу убить виджеты оболочки gnome?
  • Как процесс может иметь другое имя в выпуске ps?
  • Как дождаться завершения процесса копирования (cp)?
  • Поиск процессов с использованием сетевого интерфейса
  • Мне нужна помощь с помощью cronjob, чтобы следить за безудержными процессами и убивать их
  • 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 не рекомендуется для блокировки базы данных

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

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