2015-05-20 4 views
1

У меня есть несколько программ, которые нужно запускать в определенном порядке (p1, затем p2, затем p3, затем p4). Обычно я просто делал простой сценарий или тип p1 & & p2 & & p3 & & p4.Последовательные программы запуска в Unix

Однако эти программы не выходят правильно. Я знаю, что он успешно завершен, когда печатается «Успех». В настоящее время я SIGINT, когда я вижу «Успех» или «Сбой», а затем вручную запускаю следующую программу, если это «Успех».

Есть ли более простой способ последовательного выполнения p1, p2, p3, p4 с меньшим вмешательством человека?

Редактировать: В настоящее время используется ksh, но я не против зная и другие.

+1

... и что снаряд? – bishop

+0

В настоящее время используется ksh, но я бы не прочь познакомиться с другими. – Murdius

ответ

0

Я также новичок в программировании на Linux, но нашел что-то, что может быть полезно для вас. Вы пытались использовать команду 'wait'?

из this answer на stackexchange:

sleep 1 & 
PID1=$! 
sleep 2 & 
PID2=$! 

wait $PID1 
echo PID1 has ended. 
wait 
echo All background processes have exited. 

Я не проверял это сам, но это выглядит как то, что вы описали в своем вопросе.

1

В bash вы можете передать команду grep в поисках «Успеха», а затем положиться на код результата grep. Этот трюк обертывает все выражение в фигурных скобках, чтобы получить встроенную под-оболочку. Как так:

$ cat foo.sh 
#!/bin/bash 
[ 0 -eq $(($RANDOM %2)) ] && echo 'Success' || echo 'Failure' 
exit 0 

$ { ./foo.sh | grep -q 'Success'; } && ls || df 

Часть, внутри фигурных скобок ({}) возвращает 0, если «Успех» находится на выходе, в противном случае 1, как если бы команда foo.sh сделала так себе. More details on that technique.

Я не использовал ksh в течение длительного времени, но я подозреваю, что есть similar construction.

0

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

1-й вариант - это изменить ваши программы, чтобы они завершили работу после печати сообщения результата, возвратив код успеха.

2nd - если невозможно использование вилка.

напишите, где вы делаете вилку каждый раз, когда хотите выполнить программу.

  • В дочернем процессе используйте dup2 для вывода процесса в файл по вашему выбору.

  • в основном продолжайте проверять содержимое указанного файла, пока не получите что-то, и сравните его с успехом или неудачей. -пусто файл.

  • то вы можете сделать еще одну вилку и выполнить следующую программу.
  • Повторите ту же операцию снова.

Помните, что выполнение - это команда, которая заменяет код процесса, в котором он выполняется, с кодом файла, переданного в качестве параметра, поэтому сначала сделайте вызов dup2.

0

Когда ваша программа возвращает Success или Fail и продолжает работать, вы должны убить ее, как только строка пройдет.

Сделать функцию как

function startp { 
    prog=$1 
    ./${prog} | while read -r line; do 
     case "${line}" in 
     "Success") 
     echo OK 
     mykill $prog 
     exit 0 
     ;; 
     "Fail") 
     echo NOK 
     mykill $prog 
     exit 1 
     ;; 
     *) echo "${line}" 
     ;; 
     esac 
    done 
    exit 2 
} 

Вам нужно добавить функцию Майкилл, которая выглядит для программы рх и убивает его (xargs хорошо для него).

Вызов функции, как

startp p1 && startp p2 && startp p3 
Смежные вопросы