Csh脚本等待多个pid

时间:2019-03-21 03:13:38

标签: linux csh

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

wait命令等待所有列出的PID完成之前,继续进行下一行

例如

wait $job1_pid $job2_pid $job3_pid
nextline
我通常看到的

在线文档仅显示了只有1个PID的wait命令,尽管我已经读过使用wait for multiple PID,例如: http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/MAN/MAN1/0522____.HTM

上面写着:“如果指定了代表已知进程ID的一个或多个pid操作数,wait实用程序将等到所有它们都终止为止”

1 个答案:

答案 0 :(得分:1)

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

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


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

  

等待:shell等待所有后台作业。如果外壳是交互式的,中断将中断等待并导致外壳   打印所有未完成工作的名称和工作编号。

您可以在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 $1 }' > $PIDDIR/job

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

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

#!/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',包括单引号。