Удалить все мои процессы, которые были запущены в течение последнего часа?

Как заметил @Jonas, вам нужно ?для соответствия одному символу и *для соответствия нескольким символам. Символ пробела необходимо экранировать с помощью \.

Если первый шаблон **-**** ?изменен на ??-????\ *и экранированные символы пробела, команда должна быть:

cp -r /volume1/User/save/01/??-????\ */GROUPES\ ??-????/ /volume1/User/save/01/
1
05.11.2021, 02:55
1 ответ
  1. найти процессы, которые моложе часа
  2. извлечь pids
  3. убить пидов

список процессов:

$ ps -e -o pid,user,etimes,comm \
    | awk -v me=$USER '$2 == me && $3 <= 3600 { print }'

Производит

 661162 jaroslav    3006 chrome
 667859 jaroslav    1711 chrome
 669145 jaroslav    1471 chrome
 671222 jaroslav    1016 chrome
 675278 jaroslav     270 chrome
 675578 jaroslav     207 sleep
 676094 jaroslav      91 chrome
 676102 jaroslav      91 chrome
 676528 jaroslav      11 chrome
 676529 jaroslav      11 chrome
 676553 jaroslav      11 chrome
 676602 jaroslav       3 top
 676615 jaroslav       0 ps
 676616 jaroslav       0 awk

извлечь pids:

$ ps -e -o pid,user,etimes,comm \
    | awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }'

Убить подидов:

 $ ps -e -o pid,user,etimes,comm \
    | awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }' \
    | xargs -rt kill

Аргументы tr -для xargs являются необязательными и будут пропускать xargs, если нет вывода, и сообщать о каждой выполненной строке.

Вы даже можете протестировать его с помощью kill -0, который ничего не делает для остановки процесса, но сообщает об ошибке, если процесс больше не выполняется.

$ ps -e -o pid,user,etimes,comm \
    | awk -v me=$USER '$2 == me  && $3 <= 3600 { print $1 }' \
    | xargs -rt kill -0 
kill -0 661162 667859 669145 671222 675278 676602 677310 677311 677883 677893 677965 677966 677967 677968
kill: (677966): No such process
kill: (677967): No such process

Понимая, что этот канал/скрипт может убить себя после обратной связи, (обратите внимание на etimes=0 в списке процессов выше ), здесь приведена исправленная версия, которая игнорирует самые последние процессы:

ps -u "$LOGNAME" -o pid,etimes,comm \
  | awk '$2 <= 3600 && $2 > 1 { print $1 }' \
  | xargs -rt kill -0

Это, вероятно, не очень переносимо, но должно работать на Linux (по крайней мере на Ubuntu 18 ). Надеюсь, это дало вам некоторое представление о том, как подойти к этой проблеме.

<mother-mode>Запустите команду ps без awk и xargs и сначала убейте, чтобы увидеть, что будет убито, и будьте осторожны при запуске от имени пользователя root.Вы потенциально можете выключить систему или убить какую-то важную службу, которая недавно была перезапущена.</mother-mode>

3
05.11.2021, 11:01

Теги

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