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}') 

  • Может ли скрипт работать даже после его смерти?
  • процесс pkill, содержащий специальные символы
  • Почему команда killall убивает только один экземпляр процесса?
  • Как найти источник нереста?
  • Предотвращение случайного убийства неправильного процесса в htop
  • Разница между «убить | pgrep dnsspoof "и" kill `pgrep dnsspoof"
  • Не удается завершить или приостановить фоновое задание
  • Как выйти или отменить команду bad bash?
  • 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

    Всплывающее окно Python virtualenvwrapper и ZSH

    Как установить Fedora или любой другой Linux на жесткий диск USB и настроить загрузку?

    Кто решает, есть указатель мыши или сенсорный экран?

    Как задержать запуск программы при загрузке – Xubuntu

    Замена sntp для аргумента -P (подсказка)

    Извлечь двоичные файлы из pcap с помощью командной строки (скрипта)

    Что я могу сделать, чтобы подчеркнуть тест нового жесткого диска USB?

    Запуск Debian i386 двоичный код на Debian armel через qemu

    Как работает ошибка сегментации под капотом?

    Как смотреть фильмы / изображения без X?

    Как найти повторяющиеся строки в текстовом файле, в то время как некоторые могут быть прокомментированы или иметь разные токены в начале?

    Укажите опцию diff для подсказки файла конфигурации dpkg

    fstrim "операция сброса не поддерживается" с ext4 на LVM

    Как найти расположение всех файлов с определенным именем, содержимое которого содержит определенную строку?

    Как получить / получить источники для ядра 2.6.36-gentoo-r4 в дистрибутиве Gentoo Linux?

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