【问题标题】:Csh script wait for multiple pidcsh脚本等待多个pid
【发布时间】:2019-03-21 03:13:37
【问题描述】:

wait 命令是否在 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

引用“如果指定了一个或多个 pid 操作数来表示已知进程 ID,则等待实用程序将等待它们全部终止”

【问题讨论】:

  • 一个陈旧的建议:换一个 shell 来编写脚本。 (我的“资格”是:我使用tcsh 作为我的交互式外壳,并且在这里或那里也使用它来编写脚本)
  • 是……那是一个数字 Unix 联机帮助页吗?伙计,这让我回来了。你到底是怎么挖出那块化石的?

标签: linux csh


【解决方案1】:

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

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


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

wait shell 等待所有后台作业。如果 shell 是交互式的,中断会打断等待并导致 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 或类似的方式编写此脚本,其中内置的 wait 确实允许您等待 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' 结束该heredoc,包括单引号。

【讨论】:

  • wait 不能用作外部命令。进程只能等待自己的子进程,后台进程是 shell 的子进程,而不是 shell 产生的新进程的子进程。
  • Re "进程只能等待自己的子进程",仅供参考,非父进程可以在 Windows 中等待进程结束
  • 如果我在等待多个时间不确定的进程怎么办。喜欢:./random_time_process1 &amp;job1 = $!./random_time_process2 &amp;job2 = $!wait $job1wait $job2如果 job2 的终止速度比 job1 快,wait 会有什么反应?
  • @TheSprintingEngineer 在 bash 中,wait 内置函数将等待指定的进程,而不管其他进程先完成。如果您需要对作业完成的顺序做出反应,那么我建议您使用 Perl 或 Python。如果您想对作业订单做出反应,另一种选择是让您的作业在启动时在目录中创建临时文件,并在完成后将其删除,然后在 bash 脚本中使用一个循环来检查目录的内容每秒一次。在 shell 脚本中做一些奇怪的事情会降低它的可靠性和维护难度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2022-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多