如何获取嵌套在引号中的命令的PID?

时间:2019-01-25 02:02:49

标签: bash

我正在尝试在引号内获取命令的PID(例如some-command-here)。能够与由{em> some-command-here产生的进程进行交互:

x-terminal-emulator -e "some-command-here" &> /dev/null

例如,有时apt full-upgrade -y可能需要用户输入,因此,some-command-here产生的过程必须保持交互性。

2 个答案:

答案 0 :(得分:0)

x-terminal-emulator -e "some-command-here & echo $! >/tmp/pid" &> /dev/null
cat /tmp/pid

...或摆脱&& / dev / null:

x-terminal-emulator -e "some-command-here & echo $!"

答案 1 :(得分:0)

因此,通过更多的测试和研究,似乎可以使用ps axgrepxargscut来完成此任务。

ps ax | grep -v "grep" | grep "sh -c" | grep "some-command-here" | xargs | cut -d ' ' -f 1

这是如何工作的?

通过x-terminal-emulator传递-e时,它将产生一个新的shell窗口,并在引号中传递命令。为了执行命令,它将新的外壳程序命令sh -c与引用的命令一起传递给新外壳。因此,sh -c some-command-here。在上面的PID搜索中使用。

ps ax列出了当前正在运行的进程。

grep -v "grep"搜索输出并删除包含grep的所有进程作为进程,这仅仅是因为当我们启动此查询时,将创建grep下的进程。

grep "sh -c"在输出中搜索包含sh -c的进程。

grep "some-command-here"ps ax的输出中搜索与引号内内容匹配的过程。

xargsgrep "sh -c some-command-here"的输出转换为以空格分隔的列表。

cut -d ' ' -f 1删除空格并获取第一个结果。会返回相关进程的PID。