Csh-скрипт ожидает множественного pid

#linux #csh

#linux #csh

Вопрос:

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

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

например

 wait $job1_pid $job2_pid $job3_pid
nextline
  

поскольку документация в Интернете, которую я обычно вижу, показывает команду wait только с 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. Избитый совет: переключитесь на другую оболочку для написания сценариев. (Моя «квалификация», чтобы дать это: я использую tcsh в качестве своей интерактивной оболочки и использовал ее здесь или там также для написания сценариев)

2. faqs.org/faqs/unix-faq/shell/csh-whynot

3. Это … это цифровая справочная страница Unix? Чувак, это возвращает меня назад. Как, черт возьми, ты откопал это ископаемое?

Ответ №1:

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

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


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

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

Вы можете найти этот точный текст в документации 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 amp;

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

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

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

 #!/bin/bash

sleep 4 amp;
pid_sleep_4="$!"

sleep 7 amp;
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 amp;
pid_sleep_4="$!"

sleep 7 amp;
pid_sleep_7="$!"

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

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

'EOF'
  

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

Комментарии:

1. wait не может работать как внешняя команда. Процесс может ожидать только своих собственных дочерних элементов, а фоновые процессы являются дочерними элементами оболочки, а не нового процесса, порожденного оболочкой.

2. Re » Процесс может ждать только своих собственных дочерних элементов «, к вашему сведению, не родительские могут ждать завершения процесса в Windows

3.Что, если я ожидаю несколько процессов с неопределенным временем. Например: ./random_time_process1 amp; job1 = $! ./random_time_process2 amp; job2 = $! wait $job1 wait $job2 как отреагирует wait, если job2 завершится быстрее, чем job1?

4. @TheSprintingEngineer в bash wait встроенная программа будет ожидать указанного процесса независимо от того, какие другие процессы завершатся первыми. Если вам нужно реагировать на порядок завершения заданий, я бы рекомендовал использовать Perl или Python. Другой альтернативой, если вы хотите реагировать на порядок выполнения заданий, является то, чтобы ваши задания создавали временные файлы в каталоге при запуске и удаляли их по завершении, а затем запускали цикл в вашем bash-скрипте, который проверяет содержимое каталога раз в секунду. Выполнение странных действий в сценарии оболочки сделает его менее надежным и более сложным в обслуживании.