как программировать в этом bash-скрипте фоновые процессы - PullRequest
1 голос
/ 23 ноября 2011

У меня есть три сценария оболочки, например, A, B и C. Мне нужно запустить A в фоновом режиме и запустить B в фоновом режиме, пока A не завершит свое выполнение в фоновом режиме. Аналогичным образом запускайте C на переднем плане, пока A и B не закончат свое выполнение.

Я делал это для 2 процессов ранее таким образом.

./A.sh &  
while ps -p $! >/dev/null; do   
./B.sh  
done 

Мне нужно запустить B в фоновом режиме и C на переднем плане, пока A не завершит свое выполнение в фоновом режиме. Как мне изменить приведенный выше код.

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Это запустит A & B в фоновом режиме с C на переднем плане; B & C будет зацикливаться, пока A не закончит:

#!/bin/bash

./A.sh &
APID=$!

while ps -p ${APID} >/dev/null; do
    ./B.sh & ./C.sh
done

Пример из моей коробки:

[ 09:39 jon@hozbox.com ~/SO/bash ]$ cat A.sh
#!/bin/bash
echo "A Started at: `date`"
sleep 30
echo "A Finished at: `date`"

[ 09:39 jon@hozbox.com ~/SO/bash ]$ cat B.sh
#!/bin/bash
echo "B Started at: `date`"
sleep 10
echo "B Finished at: `date`"

[ 09:39 jon@hozbox.com ~/SO/bash ]$ cat C.sh
#!/bin/bash
echo "C Started at: `date`"
sleep 5
echo "C Finished at: `date`"

[ 09:38 jon@hozbox.com ~/SO/bash ]$ ./how-to-program-in-this-bash-script-of-background-processes.sh
A Started at: Wed Nov 23 09:38:39 PST 2011
C Started at: Wed Nov 23 09:38:39 PST 2011
B Started at: Wed Nov 23 09:38:39 PST 2011
C Finished at: Wed Nov 23 09:38:44 PST 2011
C Started at: Wed Nov 23 09:38:44 PST 2011
B Started at: Wed Nov 23 09:38:44 PST 2011
B Finished at: Wed Nov 23 09:38:49 PST 2011
C Finished at: Wed Nov 23 09:38:49 PST 2011
C Started at: Wed Nov 23 09:38:49 PST 2011
B Started at: Wed Nov 23 09:38:49 PST 2011
B Finished at: Wed Nov 23 09:38:54 PST 2011
C Finished at: Wed Nov 23 09:38:54 PST 2011
C Started at: Wed Nov 23 09:38:54 PST 2011
B Started at: Wed Nov 23 09:38:54 PST 2011
B Finished at: Wed Nov 23 09:38:59 PST 2011
C Finished at: Wed Nov 23 09:38:59 PST 2011
C Started at: Wed Nov 23 09:38:59 PST 2011
B Started at: Wed Nov 23 09:38:59 PST 2011
B Finished at: Wed Nov 23 09:39:04 PST 2011
C Finished at: Wed Nov 23 09:39:04 PST 2011
C Started at: Wed Nov 23 09:39:04 PST 2011
B Started at: Wed Nov 23 09:39:04 PST 2011

A Finished at: Wed Nov 23 09:39:09 PST 2011
B Finished at: Wed Nov 23 09:39:09 PST 2011
C Finished at: Wed Nov 23 09:39:09 PST 2011
[ 09:39 jon@hozbox.com ~/SO/bash ]$


Как насчет разветвления A и B в одно и то же время, но поставить A на секунду, чтобы $! дал pid A:

./B.sh & ./A.sh &
while ps -p $! >/dev/null; do   
./C.sh  
done 

Вот пример из моей коробки:

[ 19:08 jon@hozbox.com ~ ]$ date
Tue Nov 22 19:08:19 PST 2011
[ 19:08 jon@hozbox.com ~ ]$ sleep 15 & sleep 20 &
[1] 1126
[2] 1127
[ 19:08 jon@hozbox.com ~ ]$ while ps -p $! > /dev/null; do sleep 1 && date; done
Tue Nov 22 19:08:26 PST 2011
Tue Nov 22 19:08:27 PST 2011
Tue Nov 22 19:08:28 PST 2011
Tue Nov 22 19:08:29 PST 2011
Tue Nov 22 19:08:31 PST 2011
Tue Nov 22 19:08:32 PST 2011
Tue Nov 22 19:08:33 PST 2011
Tue Nov 22 19:08:34 PST 2011
Tue Nov 22 19:08:35 PST 2011
Tue Nov 22 19:08:36 PST 2011
Tue Nov 22 19:08:37 PST 2011
Tue Nov 22 19:08:38 PST 2011
[1]-  Done                    sleep 15
Tue Nov 22 19:08:39 PST 2011
Tue Nov 22 19:08:40 PST 2011
Tue Nov 22 19:08:41 PST 2011
Tue Nov 22 19:08:42 PST 2011
Tue Nov 22 19:08:43 PST 2011
[2]+  Done                    sleep 20
Tue Nov 22 19:08:44 PST 2011
[ 19:08 jon@hozbox.com ~ ]$

0 голосов
/ 23 ноября 2011

Из вашей картинки видно, что вы хотите, чтобы B и C зацикливались во время работы A, а затем уничтожали оба после завершения A.Вот код для этого:

# Run A in the background and get its process ID
./A.sh &
PIDA = $!

# Loop B in the background and get its process ID
while ps $PIDA >/dev/null 2>&1; do
    ./B.sh
done &
PIDB = $!

# Loop C like B, get its PID
while ps $PIDA >/dev/null 2>&1; do
    ./C.sh
done &
$PIDC = $!

# Wait until A finishes, then kill B and C
wait $PIDA
ps $PIDB >/dev/null 2>&1 && kill $PIDB
ps $PIDC >/dev/null 2>&1 && kill $PIDC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...