Как найти и завершить удаленные процессы в Linux?

Как найти и завершить удаленные процессы в Linux?

Я разрабатываю демон, который барахлит, и теперь я не могу создавать новые процессы (т. е. я не могу запустить новый процесс, чтобы завершить другие вредоносные процессы). Поэтому мне нужно иметь возможность завершать процессы с удаленной машины. Как мне выполнить «завершение» удаленно без прав администратора? Если я не могу завершить свой собственный процесс с удаленной машины как обычный пользователь, то сообщите мне, чтобы я мог отметить это как правильный ответ.

решение1

Чтобы завершить процесс, работающий на машине, какой-то локальный процесс (или ядро) должен выдать сигнал завершения. Поэтому вам нужен способ заставить процесс выдать этот сигнал, и поскольку вы не можете создать новый процесс, вам нужно найти способ, который опирается исключительно на уже запущенные процессы.

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


Из ваших комментариев следует, что у вас все еще есть оболочка на машине. Затем есть вещи, которые вы можете сделать. Вы не можете запустить какой-либо внешний процесс, например lsили ps. Но вы можете запустить встроенные команды, например echo, read, и kill( killне является встроенной во всех оболочках, но она есть во всех оболочках, которые поддерживают управление заданиями, например bash и zsh).

Каждый процесс имеет связанный каталог в /proc: /proc/12345где 12345 — это идентификатор процесса. Таким образом, вы можете получить некоторую информацию о существующем, исследуя /proc. echoс подстановочными знаками здесь полезно, например, cd /proc; echo [0-9]*показывает идентификаторы всех запущенных процессов. Если оболочка — zsh, вы можете многое сделать с помощью квалификаторов glob; например, echo /proc/*(u$UID)показывает только процессы, запущенные под вашим идентификатором пользователя.

Способ отображения содержимого файла без разветвления:

while read -r line; do
  echo "$line"
done </path/to/file

Вы можете завершить много процессов одновременно, передав их все в kill. Если вы определили процесс, принадлежащий вашему демону, попробуйте завершить его группу процессов с помощью , kill -9 -PGIDгде PGIDнаходится идентификатор процесса лидера группы. Вы можете найти идентификатор группы процессов процесса 123 с помощью </proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp. (Эта же информация существует в более удобной для чтения форме в , /proc/123/но вы не в том состоянии, чтобы прочитать ее.) Вы также можете попробовать отправить сигнал всем вашим процессам (включая исходную оболочку) с помощью

trap : NUM
kill -NUM -1

Выберите значения NUM, отличные от KILL(9), чтобы trapкоманда заставила вашу оболочку игнорировать сигнал ( KILLневозможность перехвата).

решение2

Следующая информация была найдена наhttp://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

Уничтожение процесса с помощью команды kill в Linux/UNIX

Команда kill работает как в Linux, так и в UNIX/BSD операционных системах.

Шаг №1: Сначала вам нужно узнать PID процесса (идентификатор процесса)

Используйте команду ps или pidof, чтобы узнать идентификатор процесса (PID). Синтаксис: ps aux | grep имя_процесса pidof имя_процесса

Например, если имя процесса — lighttpd, вы можете использовать любую из следующих команд для получения идентификатора процесса:

ps aux | grep lighttpdOutput

lighttpd  3486  0.0  0.1   4248  1432 ?        S    Jul31   0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd  3492  0.0  0.5  13752  3936 ?        Ss   Jul31   0:00 /usr/bin/php5-cg

ИЛИ используйте команду pidof, которая используется для поиска идентификатора процесса запущенной программы:

pidof lighttpd

Выход

3486

Шаг №2: завершить процесс, используя PID (идентификатор процесса)

Команда выше сообщает вам PID (3486) процесса lighttpd. Теперь убейте процесс, используя этот PID:

# kill 3486

ИЛИ

# kill -9 3486

Где -9 — это специальный сигнал Kill, который завершает процесс.

примеры команд killall

НЕ ИСПОЛЬЗУЙТЕ команду killall в системе UNIX (команда только для Linux). Вы также можете использовать команду killall. Команда killall убивает процессы по имени (не нужно находить PID):

# killall -9 lighttpd

Уничтожить процесс Firefox:

# killall -9 firefox-bin

Как я уже говорил ранее, killall в системе UNIX делает что-то другое. Он убивает все процессы, а не только определенный процесс. Не используйте killall в системе UNIX (используйте kill -9).

решение3

Как вы сказали в своем комментарии, администратор — единственный человек, который может вам помочь в этом вопросе. Я предлагаю вам получитькулинарная книга Perlи прочитайте раздел 16.19, чтобы узнать о правильном методе обращения с зомби.

Связанный контент