从同一个剧本中获取ansible剧本的PID

时间:2019-10-17 16:00:36

标签: bash awk ansible

我正在尝试从剧本中获取ansible剧本的PID。我找到了一种粗略的方法,我试图使其更加精致和强大。如果我遵循find + awk命令运行,它将为用户提供ansible-playbook的所有PID。尽管它也给了我一些伪造的PID,但我需要删除它们。

例如:4229是有效的PID,我需要它,而19425是过时的PID(在ps -eaf输出中不存在),我需要将其从列表中删除。

要直观地查看其中带有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,因为ps -eaf输出中没有19425。

问题:

如何有效地组合findawkps -eaf命令以产生输出4229

顺便说一句,我尝试了Get the pid of a running playbook for use within the playbook中提供的更简单的解决方案,甚至增加了赏金,但还没有喜悦。因此,请勿将其标记为重复项,因为这是对该问题的扩展。

2 个答案:

答案 0 :(得分:1)

尝试一下:

Id probability target
0 0.75 1
1 0.78 1
2 0.34 0
3 0.84 1
4 0.13 0
5 0.34 0

如果正确列出了过时的目录,请在第6行中将#!/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' ) 更改为'rm -r`。

答案 1 :(得分:1)

由于您已经存在有关在剧本中运行剧本的问题,因此我将解决您的其他问题。

正如安德鲁(Andrew)所建议的,我认为如果要消除陈旧的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的进程是否正在运行,并且
    • 如果不是,请删除文件。

剩下的就是一个有效的过程。 (尽管不能保证这是一个烦人的过程。)

相关问题