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

Bash 从同一剧本中获取ansible剧本的PID,bash,awk,ansible,Bash,Awk,Ansible,我试图从剧本中获取ansible剧本的PID。我发现了一个粗糙的方法,我正在努力使它更加精致和健壮。如果我运行以下find+awk命令,它将提供用户提供的ansible playbook的所有PID。虽然它给了我一些虚假的PID以及我需要删除它们 例如:4229是一个有效的PID,我需要它,而19425是一个过时的PID(在ps-eaf输出中不存在),我需要从列表中删除它 要直观地查看包含PID名称的文件,请执行以下操作: meta@monk:~/.ansible/tmp>ls -lrt

我试图从剧本中获取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:~>
由于19425已从
ps-eaf
输出中消失,因此只需要4229

问题:

如何有效地组合
find
awk
ps-eaf
命令以生成输出
4229

顺便说一句,我尝试了中提供的更简单的解决方案,甚至增加了赏金,但还没有乐趣。因此,请不要将其标记为重复,因为这是对该问题的扩展

试试这个:

#!/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' )
#/bin/bash
cd~/.ansible/tmp
读取pid时;做
[-d/proc/${pid}]| | ls-lad-ansible-local-${pid}*;
完成<尝试以下操作:

#!/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' )
#/bin/bash
cd~/.ansible/tmp
读取pid时;做
[-d/proc/${pid}]| | ls-lad-ansible-local-${pid}*;

完成<既然您已经有一个关于在剧本中运行剧本的问题,我将回答您的另一个问题

正如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的进程是否正在运行,以及
    • 如果不是,请删除该文件

剩下的就是一个有效的过程。(虽然这不能保证它是一个可解析的过程。)

既然你已经有了一个关于在剧本中运行剧本的问题,我将回答你的另一个问题

正如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的进程是否正在运行,以及
    • 如果不是,请删除该文件

剩下的就是一个有效的过程。(虽然这并不保证它是一个可执行的过程。)

ps-eaf | grep
-检查pid是否在
kill-0 pid中处于活动状态。或者您可以只
[-e/proc/$pid]
为什么需要这个?在大多数与之相关的用例中,我觉得使用ansible的“异步操作”支持更合适,并让它监控流程本身。我需要获得ansible playbook流程的
/proc//cmdline
,因为我需要根据无关的输入添加检查。ansible support会检查
额外的VAR
,但不会检查
--help
--ask vault pass
等标志,因此我想不出其他方法可以提供这些信息。呃,如果你在原始文件上发布了悬赏,为什么你认为发布副本是可以接受的?首先,对
ps
使用更合适的选项似乎是一个明显的解决办法,但其他问题的许多其他答案都要好得多。@tripleee,你试过这些答案吗?他们都不为我工作。他们都给了我错误的PID
ps-eaf | grep
-使用
kill-0 pid检查pid是否处于活动状态。或者您可以只
[-e/proc/$pid]
为什么需要这个?在大多数与之相关的用例中,我觉得使用ansible的“异步操作”支持更合适,并让它监控流程本身。我需要获得ansible playbook流程的
/proc//cmdline
,因为我需要根据无关的输入添加检查。ansible support会检查
额外的VAR
,但不会检查
--help
--ask vault pass
等标志,因此我想不出其他方法可以提供这些信息。呃,如果你在原始文件上发布了悬赏,为什么你认为发布副本是可以接受的?首先,对
ps
使用更合适的选项似乎是一个明显的解决办法,但其他问题的许多其他答案都要好得多。@tripleee,你试过这些答案吗?他们都不为我工作。他们都给了我错误的PID。