Убить удаленный процесс через ssh

Это может быть загрузка ЦП процессом ядра, драйвером или прерывания.

Это не ответ, а один из подходов к его решению. Некоторые детали этого подхода специфичны для Linux. Установите sysstat aka sar и измените или добавьте crontab sar-collection (в системах RedHat, /etc/cron.d/sysstat ):

* * * * * root /usr/lib64/sa/sa1 -L -F -S XALL 10 6

Будьте готовы накопить 3 ГБ или более в течение месяца в / var / lib / sa . Если ваша версия не поддерживает ни -L , ни -F , добавьте следующую запись cron:

 57 23 * * * root rm -f /var/log/sa/sa`date --date=tomorrow +\%d`

Через день используйте sar -f / var / log / sa / saXX -C , где XX - это вчерашний день месяца как целое число в начале 0 (т. е. 01, 02, ... 10, 11 ... 31). Когда вы найдете временное окно с высокой загрузкой ЦП, вы можете проверить отчет sar для этого временного окна на наличие:

  • прерываний ( -I ALL )
  • использования сети ( -n DEV )
  • дисковый ввод-вывод ( -b )

Допустим, вы видите скачок ЦП между 10:15 и 10:18. Запустите sar в этот день (05) следующим образом:

sar -f /var/log/sa/sa05 -s 10:14:00 -e 10:19:00 -I ALL -n DEV -b | less

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

Если вы все еще ничего не видите, и вы смотрели другие параметры sar, и вы по-прежнему ничего не видите, попробуйте добавить это в cron:

* * * * * { date; /bin/ps -A --sort tty,comm,pid -ww -o pgrp:8,tty:7,pid,c,pmem:5,rss:8,sz:8,size:8=TSIZE,vsz:8,nlwp,lstart,args ;} >>/var/log/procscan

Этот файл получит ОЧЕНЬ большой, поэтому обязательно поверните его или отключите cronjob на следующий день. Но из этого вывода вы можете найти своего виновника.

Чтобы решить некоторые проблемы с этим заданием cron, я создал сценарий оболочки и набор вспомогательных файлов и поместил их на github. Вы можете найти их здесь (ссылка на проект на github)

0
24.01.2019, 12:29
2 ответа

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

Также команда внутри awk, которая печатает $2, интерполируется как аргумент строки команды -. Поэтому мы избегаем его, чтобы отложить его расширение до тех пор, пока команда не будет выполнена удаленно.

С побегом,

ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"

или здесь -документ

ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF

Также обратите внимание, что grep.. | grep.. | awkявляется лишним. Вы можете выполнить всю операцию только с помощью awk. Или, что еще лучше, используйте pkill, чтобы убить процесс напрямую по имени.

7
28.01.2020, 02:30

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

for i in `cat hostlist`;do ssh -q $i kill `ssh -q $i ps -ef | grep <process name>|awk '{print $2}'`;done  
0
31.08.2020, 15:54

Теги

Похожие вопросы