Csh скрипт ждет нескольких пидов - PullRequest
0 голосов
/ 21 марта 2019

Работает ли команда wait в сценарии csh для ожидания завершения более 1 PID?

Где команда wait ожидает завершения выполнения всех перечисленных PID, прежде чем перейти к следующей строке

например.

wait $job1_pid $job2_pid $job3_pid
nextline

поскольку в документации, которую я обычно вижу в Интернете, показана только команда ожидания только с 1 PID, хотя я уже читал об использовании wait для нескольких PID, как здесь: http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/MAN/MAN1/0522____.HTM

, в котором говорится кавычка "Если указан один или несколько операндов pid , представляющих известные идентификаторы процесса, утилита ожидания ждет, пока все они не завершатся"

1 Ответ

1 голос
/ 21 марта 2019

Нет, встроенная команда wait в csh может только ждать завершения всех заданий. Команда в документации, на которую вы ссылаетесь, является отдельным исполняемым файлом, который, вероятно, расположен по адресу /usr/bin/wait или аналогичным. Этот исполняемый файл нельзя использовать для того, для чего вы хотите его использовать.

Я рекомендую использовать bash и его более мощную встроенную wait, которая позволяет вам ждать определенных заданий или идентификаторов процессов.


На справочной странице tcsh wait ожидает всех фоновых заданий. tcsh совместим с csh, на что ссылается документация университета, на которую вы ссылаетесь.

wait Оболочка ожидает всех фоновых заданий. Если оболочка является интерактивной, прерывание прервет ожидание и вызовет оболочку распечатывать имена и номера всех оставшихся работ.

Точный текст вы можете найти в документации csh здесь .

Исполняемый файл wait, описанный в документации, на самом деле является отдельной командой, которая ожидает список идентификаторов процессов.

Однако исполняемый файл wait на самом деле не способен ожидать дочерние процессы запущенного сценария оболочки и не имеет шансов сделать правильное действие в сценарии оболочки.

Например, в OS X /usr/bin/wait - это сценарий оболочки.

#!/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 или аналогичном, где встроенное ожидание действительно позволяет вам ждать пиды, и захват пидов из фоновых заданий проще.

#!/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, над которым работаете, вы можете вызвать bash изнутри csh сценария, например, так.

#!/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'

Обратите внимание, что вы должны завершить этот heredoc с помощью 'EOF', включая одинарные кавычки.

...