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实用程序将等到所有它们都终止为止”
答案 0 :(得分:1)
否,wait
中的内置csh
命令只能等待所有作业完成。您所引用的文档中的命令是一个单独的可执行文件,可能位于/usr/bin/wait
或类似位置。此可执行文件不能用于您要使用的用途。
我建议使用bash
及其更强大的内置wait
,它确实允许您等待特定的作业或进程ID。
在tcsh
手册页中,wait
等待所有后台作业。 tcsh
与csh
兼容,这是您链接的大学所引用的文档。
等待: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'
,包括单引号。