Csh 脚本等待多个 pid

Csh script wait for multiple pid

等待命令是否在 csh 脚本中工作以等待超过 1 个 PID 完成?

其中 wait 命令等待列出的所有 PID 完成,然后再转到下一行

例如

wait $job1_pid $job2_pid $job3_pid
nextline

因为我通常看到的在线文档只显示只有 1 个 PID 的等待命令,尽管我已经阅读过使用等待多个 PID 的信息,如下所示: http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/MAN/MAN1/0522____.HTM

其中引用 "If one or more pid operands are specified that represent known process IDs,the wait utility waits until all of them have terminated"

不行,csh中的内置wait命令只能等待所有作业完成。您引用的文档中的命令是一个单独的可执行文件,可能位于 /usr/bin/wait 或类似位置。此可执行文件不能用于您想要的用途。

我建议使用 bash 及其更强大的 wait 内置函数,它允许您等待特定的作业或进程 ID。


根据 tcsh 手册页,wait 等待所有后台作业。 tcshcsh 兼容,这是您链接的大学文档所指的内容。

wait The shell waits for all background jobs. If the shell is interactive, an interrupt will disrupt the wait and cause the shell to print the names and job numbers of all outstanding jobs.

您可以在 csh documentation here 上找到准确的文本。

文档中描述的 wait 可执行文件实际上是一个等待进程 ID 列表的单独命令。

但是,wait 可执行文件 实际上不能等待 运行 shell 脚本 的子进程,并且没有在 shell 脚本中做正确事情的机会。

例如,在 OS X 上,/usr/bin/wait 就是这个 shell 脚本。

#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $
# This file is in the public domain.
builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}

无论如何,我无法让 /usr/bin/wait 可执行文件在 Csh 脚本中可靠地工作...因为后台作业不是 /usr/bin/wait 进程本身的子进程。

#!/bin/csh -f

setenv PIDDIR "`mktemp -d`"

sleep 4 &

ps ax | grep 'slee[p]' | awk '{ print  }' > $PIDDIR/job

/usr/bin/wait `cat $PIDDIR/job`

我强烈建议在 bash 或类似的环境中编写此脚本,其中内置等待确实允许您等待 pids 并且从后台作业捕获 pids 更容易。

#!/bin/bash

sleep 4 &
pid_sleep_4="$!"

sleep 7 &
pid_sleep_7="$!"

wait "$pid_sleep_4"
echo "waited for sleep 4"

wait "$pid_sleep_7"
echo "waited for sleep 7"

如果您不想重写您正在处理的整个 csh 脚本,您可以像这样从 csh 脚本内部调用 bash。

#!/bin/csh -f

bash <<'EOF'

sleep 4 &
pid_sleep_4="$!"

sleep 7 &
pid_sleep_7="$!"

wait "$pid_sleep_4"
echo "waited for sleep 4"

wait "$pid_sleep_7"
echo "waited for sleep 7"

'EOF'

请注意,您必须以 'EOF' 包括单引号结束该 heredoc。