#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-скрипте, который проверяет содержимое каталога раз в секунду. Выполнение странных действий в сценарии оболочки сделает его менее надежным и более сложным в обслуживании.