我正在尝试从剧本中获取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。
问题:
如何有效地组合find
,awk
和ps -eaf
命令以产生输出4229
?
顺便说一句,我尝试了Get the pid of a running playbook for use within the playbook中提供的更简单的解决方案,甚至增加了赏金,但还没有喜悦。因此,请勿将其标记为重复项,因为这是对该问题的扩展。
答案 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
这基本上是说:
ps
查看该pid的进程是否正在运行,并且剩下的就是一个有效的过程。 (尽管不能保证这是一个烦人的过程。)