Сценарий bash: анализ выходных данных команды grep и передача второго действия - PullRequest
0 голосов
/ 06 октября 2018
docker-compose down 

иногда дает сбой, оставляя занятые ресурсы, которые не позволяют полностью размонтировать и перемонтировать тома докера1007 *

/proc/12053/mountinfo
/proc/16127/mountinfo
...
/proc/16139/mountinfo
/proc/16192/mountinfo

и т. Д.

, где каждое число - это PID процесса, теперь я могу сделать

kill -9 16139 12053 ... 16139

Я пытаюсь поместить это в скрипт bash, чтобы помочь автоматизировать этопроцесс.

Вопрос: Мне нужно передать вывод команды grep через правильное регулярное выражение, чтобы разобрать 2-й аргумент (значение int в каждой строке / proc / 16192 / mountinfo).Мне нужно собрать их в строку, разделенную пробелом, и, наконец, передать эту строку в качестве аргумента kill.

Я не совсем уверен, как подойти к этому в скриптах bash

Любые и все указатели приветствуются

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Всякий раз, когда вы обнаружите, что хотите разобрать вывод grep, sed и т. Д., Вам следует рассмотреть возможность использования вместо этого awk.

procs=$(awk '/12c8b1e0d711db12b/{split(FILENAME,f,"/"); print f[3]}' /proc/*/mountinfo)
[ -n "$procs" ] && kill -9 "$procs"
0 голосов
/ 06 октября 2018

Вы можете использовать bash-скрипты с подстановкой параметров для извлечения идентификатора процесса и помещения их в массив, а затем использовать kill для него.

Например:

declare -a process
for t1 in $(grep -l 12c8b1e0d711db12b /proc/*/mountinfo); do
   t2="${t1#/proc/}" # remove /proc/ from beginning
   pid="${t2%/mountinfo}" # remove /mountinfo from the end
   process+=("$pid")
done

kill -9 "${process[@]}"
...