在我的脚本中,我有以下内容:
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
运行时被接收。