8 способов убить процесс с помощью команды killall в Linux

Linux
8 способов убить процесс с помощью команды killall в Linux

Командная строка Linux предоставляет множество команд для уничтожения процесса. Например, вы можетеkillкоманда передать PID, чтобы убить процесс;pkillВ качестве входных данных команда принимает регулярное выражение, поэтому процессы, соответствующие шаблону, уничтожаются.

Но есть еще одна команда, называемаяkillall, по умолчанию он точно соответствует имени параметра, а затем уничтожает соответствующий процесс. В этой статье мы обсудим практическое применение этой команды.

По умолчанию команда killall отправляет процессу /groupSIGTERMОднако сигналы также могут отправлять указанный сигнал через параметр.

Ниже мы подробно рассмотрим 8 основных способов использования killall на примерах.

1. Основное использование

Если у нас запущено 3 процесса, ониhello1, hello2, hello3Теперь мы хотим убить процесс Hello1, вы можете использовать его напрямую следующим образом:

killall hello1

Результат запуска следующий:

[alvin@VM_0_16_centos test]$ ps aux | grep hello
alvin    12061  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello1
alvin    12074  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello2
alvin    12084  0.0  0.0   4152   340 pts/0    S    14:41   0:00 ./hello3
alvin    12089  0.0  0.0 112648   964 pts/0    R+   14:41   0:00 grep --color=auto hello
[alvin@VM_0_16_centos test]$ killall hello1
[1]   Terminated              ./hello1
[alvin@VM_0_16_centos test]$ ps aux | grep hello
alvin    12074  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello2
alvin    12084  0.0  0.0   4152   340 pts/0    S    14:41   0:00 ./hello3
alvin    12170  0.0  0.0 112648   964 pts/0    R+   14:42   0:00 grep --color=auto hello

Как видите, процесс hello1 был убит.

Остальные процессы hello2 и hello3, мы хотим убить их все сразу, то есть убивать процессы пачками, мы можем сделать следующее:

[alvin@VM_0_16_centos test]$ killall hello*
hello: no process found
hello1: no process found
hello.c: no process found
[2]-  Terminated              ./hello2
[3]+  Terminated              ./hello3

Таким образом, все процессы, начинающиеся с приветствия, уничтожаются.

2. Завершить процесс, запущенный пользователем

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

Например, пользователь Harry теперь работает несколько процессов следующим образом:

[alvin@VM_0_16_centos test]$ ps aux | grep harry
root     13675  0.0  0.2 148236  5584 ?        Ss   14:55   0:00 sshd: harry [priv]
harry    13677  0.0  0.1 148236  2944 ?        S    14:55   0:00 sshd: harry@pts/1
root     13678  0.0  0.2 148236  5444 ?        Ss   14:55   0:00 sshd: harry [priv]
harry    13680  0.0  0.1 148236  2252 ?        S    14:55   0:00 sshd: harry@notty
harry    13681  0.0  0.1  53228  2168 ?        Ss   14:55   0:00 /usr/libexec/openssh/sftp-server
harry    13694  0.0  0.1 116436  3252 pts/1    Ss+  14:55   0:00 -bash
harry    13948  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello1
harry    13952  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello2
harry    13959  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello3
alvin    14005  0.0  0.0 112648   964 pts/0    R+   14:58   0:00 grep --color=auto harry

Теперь мы хотим убить все процессы, запущенные в Harry, и можем действовать следующим образом:

killall -u harry

Результаты приведены ниже:

[alvin@VM_0_16_centos test]$ sudo killall -u harry
[alvin@VM_0_16_centos test]$ ps aux | grep harry
alvin    14040  0.0  0.0 112648   964 pts/0    R+   14:58   0:00 grep --color=auto harry

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

3. Завершить процесс в конце времени

Если у нас сейчас запущено много программ, и мы просто хотим убить процессы, которые работают более 5 часов, то мы можем использовать-oварианты, где o означает старше, следующим образом:

killall -o 5h

Точно так же, если вы хотите убить процесс, который занимает менее 4 часов, вы можете использовать-yварианты, где y означает более молодой, следующим образом:

killall -y 4h

Эти два варианта также очень грубы и также будут выходить из терминала, поэтому я не буду их демонстрировать.

4. Игнорировать регистр

По умолчанию команда killall чувствительна к регистру, поэтому мы не сможем правильно завершить процесс, если неправильно напишем регистр.

[alvin@VM_0_16_centos test]$ killall HELLO1
TEST1: no process found

Если мы хотим игнорировать регистр, мы можем добавить-I(заглавная i) вариант.

[alvin@VM_0_16_centos test]$ killall -I HELLO1
[1]   Terminated              ./hello1

5. Закройте команду echo

По умолчанию killall сообщит вам о выполнении команды, но что, если нас не волнует результат ее выполнения, и мы просто хотим, чтобы она выполнялась молча? просто добавь-qвариант, где q представляет вполне, следующим образом:

[alvin@VM_0_16_centos test]$ killall HELLO2
HELLO2: no process found
[alvin@VM_0_16_centos test]$ killall -q HELLO2
[alvin@VM_0_16_centos test]$

6. Перечислите все поддерживаемые сигналы

Как упоминалось ранее, команда killall по умолчанию отправляет сигнал SIGTERM, поэтому может ли Энн отправлять другие сигналы? Конечно, это возможно. можно использовать-lопция для просмотра всех сигналов, поддерживаемых killall:

[alvin@VM_0_16_centos test]$ killall -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

вы можете использовать-sопция (за которой следует имя сигнала) для отправки специального сигнала процессу.

7. Интерактивная работа

Если вам неудобно убивать несколько процессов и вы беспокоитесь об уничтожении процессов, которые не следует убивать, вы можете использовать-iварианты, так что вы можете свободно решать, какие процессы следует убить, а какие оставить.

[alvin@VM_0_16_centos test]$ killall -i hello*
Kill hello2(13825) ? (y/N) y
Kill hello3(13831) ? (y/N) N
hello: no process found
hello1: no process found
hello3: no process found
hello.c: no process found
[2]-  Terminated              ./hello2

8. Дождитесь завершения процесса

Когда сигнал отправляется процессу, если вы хотите быть уверены, что процесс был убит, прежде чем вернуть результат выполнения, вы можете использовать-woptions, где w означает ожидание, следующим образом:

[alvin@VM_0_16_centos test]$ killall -w hello1
[4]+  Terminated              ./hello1

Похоже, что здесь нет эффекта, но когда на самом деле его выполняется, его можно найти, что результат выполнения появится через секунду или два. Если опция -w не добавляется, результат выполнения будет отображаться немедленно.

Кодировать слова непросто, если вы найдете это полезным, пожалуйста, поставьте лайк и уходите~

-----------------

Публичный аккаунт поиска WeChat【Хороший линукс], ключевое слово фонового ответа:

  1. Отвечать【1024]: Бесплатный доступ к огромным техническим ресурсам, которые постоянно обновляются;

  2. Отвечать【CSDN]: бесплатный доступ к группе загрузки ресурсов CSDN;

  3. Отвечать【в группу]: Бесплатный доступ к основной группе обмена технологиями Ruyun.

Обмен галантерейными товарами · Обмен ресурсами · Улучшение когнитивных функций · Изучение английского языка

Кодировать слова непросто, если вы найдете это полезным, пожалуйста, поставьте лайк и уходите~

-----------------

Я Лян Сюй,Топ 500Иностранная компания Linux-разработчик, специализирующаяся на производстве Linux-галантереи. Добро пожаловать, чтобы обратить внимание на мой публичный номер "Хороший линукс",Отвечать"1024"Получите самую свежую и полную техническую информацию, ответьте"вступить в группу«Войдите в экспертную группу по обмену технологиями Ruyun.