Как сделать параллельную обработку в сценарии Unix Shell? - PullRequest
5 голосов
/ 11 мая 2010

У меня есть сценарий оболочки, который передает файл build.xml на удаленный компьютер Unix ( devrsp02 ) и выполняет задачу ANT wldeploy на этом компьютере ( devrsp02 ). Теперь эта задача wldeploy занимает около 15 минут, и пока она выполняется, последняя строка в консоли unix -

"задача {некоторая цифра} инициализирована".

Как только эта задача будет выполнена, мы получим сообщение «Задача выполнена», и следующая задача в скрипте будет выполнена только после этого.

Но иногда могут возникнуть проблемы с доменом weblogic, и развертывание может завершиться сбоем внутри системы, что не повлияет на состояние задачи wldeploy. Консоль Unix по-прежнему будет зависать при «инициализации задачи {некоторая цифра}». Ошибка развертывания будет записываться в файл с именем output.a

Итак, я хочу сейчас -

Запустите счетчик времени перед запуском wldeploy. Если wldeploy выполняется более 15 минут, должна быть выполнена следующая команда -

tail -f output.a ## без завершения wldeploy

или

cat output.a ## после принудительного завершения wldeploy

Следует отметить следующее: я не могу запустить задачу wldeploy в фоновом режиме, так как в этом случае пользователь не узнает, когда задача будет завершена, что крайне важно для этого сценария.

Не могли бы вы предложить что-нибудь для достижения этой цели?

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Создать этот скрипт (например, deploy.sh):

#!/bin/sh
sleep 900 && pkill -n wldeploy && cat output.a &
wldeploy 

Затем с консоли

chmod +x deploy.sh

Затем запустите

./deploy.sh

Этот скрипт запустит счетчик (15 минут), который принудительно уничтожит процесс wldeploy, если он запущен, и если процесс запущен, вы увидите содержимое output.a.

Если выполнение сценария завершено, pkill не вернет true и output.a не будет отображаться.

Я бы назвал эту задачу мониторингом, а не "параллельной обработкой":)

1 голос
/ 11 мая 2010

Это только убьет запущенный процесс wldeploy, сообщит вам, вернул ли wldeploy успех или сбой, и запустится не более, чем через 30 секунд после завершения wldeploy.

Это должно быть sh-совместимым, но / bin / sh, к которому у меня есть доступ, похоже, содержит неработающую команду ожидания.

#!/bin/ksh 
wldeploy &
while [ ${slept:-0} -le 900 ]; do
    sleep 30 && slept=`expr ${slept:-0} + 30`
    if [ $$ = "`ps -o ppid= -p $!`" ]; then
        echo wldeploy still running
    else
        wait $! && echo "wldeploy succeeded" || echo "wldeploy failed"
        break
    fi
done
if [ $$ = "`ps -o ppid= -p $!`" ]; then
   echo "wldeploy did not finish in $slept seconds, killing it"
   kill $!
   cat output.a
fi
0 голосов
/ 22 сентября 2012

Для части без завершения wldeploy это просто, просто выполнить до

  { sleep 900; tail -f output.a; } &

Для части с kill it это сложнее, так как вы должны определить PID процесса wldeploy. Ответ Пра делает именно это, поэтому я бы просто сослался на это.

...