在我的脚本中,我有以下内容:
cat list | xargs -P6 -n2 ./first_queue &
wherelist
只是一个包含我要处理的单词对的文件:
单词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
这是非常简化的(对于给我带来麻烦的命令,尽管在父进程(即 xargs 以及子进程)上first_queue
运行,但它仍在运行):kill
srr=$1
bioproject=$2
prefetch $srr -O download_dir/$bioproject
prefetch
只需从在线数据库下载数据。
您获得的 PID
$!
是xargs
自己的 PID(因为这是xargs
您正在发送到后台...),而不是您的进程之一。如果您终止它,它将终止其所有子进程(即,您的任何进程仍在运行)。如果你想要子进程的 pid,你可以使用
pgrep -P {parent}
where{parent}
isxargs
PID。编辑:
当您在脚本 (pid=X) 中运行命令 (pid=Y) 并向脚本发送信号(到 pid=X)时,信号不会转发给命令(因此 pid=Y 看不到它)。
您可以编写一个人为的脚本,在后台启动命令,获取它的 pid (Y),捕获发送到 pid=X 的信号并将它们转发到 pid=Y。
但在许多情况下,命令是要运行的代码的最后一个有效位(脚本以命令的返回码退出)。如果是这样,而不是使用:
您将脚本编写为:
在第一种情况下,脚本是 pid=X 的进程,命令是 pid=Y 的进程。有了
exec
,pid=X 的进程就变成了 command,一切就像你the_command
直接调用一样发生:没有 pid=Y,发送到进程 X(脚本)的信号the_command
在运行时被接收到。