从 xargs 获取所有生成进程的进程 ID

从 xargs 获取所有生成进程的进程 ID

在我的脚本中,我有以下内容: cat list | xargs -P6 -n2 ./first_queue &其中list只是一个包含我想要处理的单词对的文件:

单词1 单词2

单词3 单词4

ETC...

first_queue只是另一个脚本。我试图在调用此 xargs 后立即获取其生成的所有 6 个进程的 pid,以便稍后终止它们。我读到它$!给出了在后台运行的最后一个进程的 pid。但是,我想要所有 6 个进程。我该如何获得它们?

更多细节:

我编写了以下小脚本来测试@xenoid 的建议:

cat list | xargs -P6 -n2 ./first_queue &
id=$(echo $!)
echo $id
ids=$(pgrep -P $id)
echo $ids
ps aux | grep $id
for x in $ids; do
    echo $x
    ps aux | grep $x
    kill $x
done
kill $id
ps aux | grep $id
for x in $ids; do
    ps aux | grep $x
done

这里first_queue极其简化了(对于给我带来麻烦的命令,尽管kill在父进程即 xargs 以及子进程上运行,该命令仍继续运行):

srr=$1
bioproject=$2

prefetch $srr -O download_dir/$bioproject

prefetch只是从在线数据库下载数据。

答案1

您获得的 PID$!xargs自己的 PID(因为这是xargs您要发送到后台的 PID...),而不是您的进程之一。如果您终止它,它将终止其所有子进程(即,任何仍在运行的进程)。

如果您想要子进程的 PID,您可以使用PID的pgrep -P {parent}位置。{parent}xargs

编辑:

当您在脚本(pid=X)中运行命令(pid=Y)并向脚本(pid=X)发送信号时,该信号不会转发给命令(因此 pid=Y 看不到它)。

您可以写编写脚本在后台启动命令,获取其 pid(Y),捕获发送到 pid=X 的信号并将其转发给 pid=Y

但在许多情况下,命令是运行的最后一个有效代码位(脚本以命令的返回代码退出)。在这种情况下,不要使用:

some_initialization_code
the_command and the command args
exit $?

你的脚本如下:

some_initialization_code
exec the_command and the command args

在第一种情况下,脚本是 pid=X 的进程,命令是 pid=Y 的进程。对于exec,pid=X 的进程成为命令,并且一切都像您the_command直接调用一样发生:没有pid = Y,并且发送到进程X(脚本)的信号在the_command运行时被接收。

相关内容