Получите PID ансамбля playbook из одной и той же книги. - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь получить PID от игровой книги. Я нашел один грубый подход, я пытаюсь сделать его более изысканным и надежным. Если я запускаю следующую команду find + awk, она дает мне все PID ansible-playbook пользователем. Хотя это также дает мне несколько поддельных PID, и мне нужно их удалить.

Например: 4229 - это действительный PID, и он мне нужен, тогда как 19425 - устаревший PID (отсутствует в выводе ps -eaf), и мне нужно удалить его из моего списка.

Toвизуально просмотрите файлы с именами PID:

meta@monk:~/.ansible/tmp>ls -lrt
total 8
drwx------ 2 monk admin4096 Oct 16 13:09 ansible-local-19425A_62FT
drwx------ 3 monk admin4096 Oct 17 10:38 ansible-local-4229U_pXdg
meta@monk:~/.ansible/tmp>

Чтобы извлечь имена PID:

meta@monk:~/.ansible/tmp>find . -type d |awk 'NR>1{pid=gensub(/.\/ansible-local-([0-9]+)._.*$/,"\\1","g",$NF);print pid}'
4229
4229
19425

Чтобы проверить, активен ли PID:

meta@monk:~>ps -eaf |grep -iE '4229|4229|19425'
monk   4229  2179  5 10:33 pts/26   00:00:49 /usr/local/bin/python /usr/local/bin/ansible-playbook pid.yml -vv
monk   5303  4229  0 10:38 pts/26   00:00:00 /usr/local/bin/python /usr/local/bin/ansible-playbook pid.yml -vv
monk   5744  5569  0 10:49 pts/3    00:00:00 grep -iE 4229|4229|19425
meta@monk:~>

Требуется только 4229, поскольку 19425 ушло из ps -eaf вывода.

Вопрос:

Как объединить find, awkps -eaf эффективно выводят команду 4229?

Кстати, я пробовал более простые решения, представленные в Получить pid работающей пьесы для использования в playbook , дажедобавлена ​​щедрость, но радости пока нет. Поэтому, пожалуйста, не отмечайте его как дубликат, так как это расширение этого вопроса.

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Поскольку у вас уже есть вопрос о запуске playbook в пределах playbook, я отвечу на ваш другой вопрос.

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

for f in ~/.ansible/tmp/ansible-local-*; do
  [[ $f =~ .*-([0-9]+) ]]
  pid="${BASH_REMATCH[1]}"
  ps "$pid" >/dev/null || rm -vf "$f"
done

Это в основном говорит:

  • Для каждого файла Ansible,
    • извлечь pid из имени файла,
    • используйте ps, чтобы увидеть, запущен ли процесс по этому pid, и
    • , если это не так, удалите файл.

Все, что остается, является действительным процессом. (Хотя это не гарантирует, что это ансибильный процесс.)

1 голос
/ 19 октября 2019

Попробуйте это:

#!/bin/bash

cd ~/.ansible/tmp

while read pid; do
  [ -d /proc/${pid} ] || ls -lad ansible-local-${pid}*;
done < <(find . -type d | sed -n 's/^ansible-local-\([0-9]*\).*$/\1/p' )

Если правильно перечислить устаревшие каталоги, то измените ls -lad на 'rm -r` в строке 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...