在复杂的Unix命令中的pgrep/pkill命令中创建负前视

jm81lzqq  于 2022-09-21  发布在  Unix
关注(0)|答案(2)|浏览(225)

我正在编写一个守护进程,它将登录到其他计算机以确认服务正在运行,并启动、停止或终止它。正因为如此,Unix命令变得有点冗长和混乱。

正在形成的命令的基本形状如下:

bash -c 'ssh -p 22 user@host.domain.com pgrep -fl "APP.*APP_id=12345"'

其中app是远程可执行文件的名称,app_id是启动时传递给应用程序的参数。

在远程端运行的可执行文件将以如下方式启动:

/path/to/APP configs/config.xml -v APP_id=12345 APP_port=2345 APP_priority=7

此命令的退出状态用于确定远程服务是否正在运行、是否已成功启动或终止。

我遇到的问题是,当在我的本地机器上测试时,ssh连接到本地机器以简化操作,但是以这种方式调用的pgrep也将识别服务器正在运行以进行检查的ssh命令。

例如,pgrep可能会返回:

26308 ./APP configs/config.xml APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5 APP_nodeType=all APP_exportPort=6500 APP_clientPriority=11
27915 ssh -p 22 user@localhost pgrep -fl APP.*APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5

因此,合乎逻辑的下一步是更改pgrep模式以排除‘ssh’,但这似乎是不可能的,因为pgrep似乎不是用允许查找头的PCRE版本编译的,例如:

bash -c -'ssh -p 22 user@localhost preg -fl "(?!ssh).*APP.*APP_id=12345"

这将抛出一个正则表达式错误,因此作为一种解决方法,我使用了grep:

bash -c 'ssh -p 22 user@host.domain.com pgrep -fl "APP.*APP_id=12345" \| grep -v ssh'

这对于使用pgrep进行查询非常有效,尽管这是一种变通方法。然而,使用pkill的下一步并不起作用,因为grep没有机会发挥作用:

bash -c 'ssh -p 22 user@host.domain.com pkill -f "APP.*APP_id=12345"'

不能很好地工作,因为pkill还会终止ssh连接,这会导致退出状态变差。因此,我又开始修改我的pgrep/pkill模式,但运气不是很好。

这个环境可以在本地机器上用简单的东西模拟,不需要密码就可以ssh到自己(在本例中,app将是‘watch’):

watch echo APP_id=12345

问题很简单:如何在pgrep中匹配‘app’而不是‘ssh user@host app’?

qjp7pelc

qjp7pelc1#

这是一种变通办法,但它的作用是:

bash -c 'ssh -p 22 user@host.domain.com pgrep -fl "^[^s]*APP.*APP_id=12345"'

...它只匹配应用程序名称前没有空格的命令。这还不是完全的,因为指向可执行文件的路径可能包含一个带有空格的目录,但是如果没有Lookround语法,我还没有想出其他方法来实现这一点。

b4qexyjb

b4qexyjb2#

真的很老,但是!

EXPORT VAR=“agent.py”;pkill-f.*my$VAR;

相关问题