2013-05-06 3 views
3

Я использую shell process pool API на Github, для сценария, как показано нижеМожно ли создать не-дочерний процесс внутри сценария оболочки?

function foobar() 
    { 
     mytask($1); 
    } 

    job_pool_init 100 0 
    tcpdump -i eth0 -w tempcap &   # 
    for i in `seq 1 4`;do 
     mesg="hello"$i 
     job_pool_run foobar $mesg 
     sleep 5 
    done 

    job_pool_wait 
    pkill tcpdump       # 
    echo 'all finish' 
    job_pool_shutdown 

если я закомментировать TCPDUMP линию, то он работает отлично, как и ожидалось, но когда ТСРйитр линия есть, В job_pool_wait есть команда wait, которая ждет окончания всех процессов с детьми, если такой строки tcpdump нет, это так, как ожидалось. Но я хочу захватить что-то, пока все дочерние процессы не закончатся, поэтому я должен использовать tcpdump. В этом скрипте процесс tcpdump является дочерним процессом, job_pool_wait также ждет окончания процесса tcpdump, чего не ожидается.

так что решение должно сделать tcpdump не дочерним процессом, как я могу это сделать, или любые другие решения?

ответ

2

Вы должны быть в состоянии запустить tcpdump в суб-оболочки в фоновом режиме:

(tcpdump -i eth0 -w tempcap &) 

Это должно предотвратить его появление как прямой потомок вашего сценария.

+0

ничего себе, здорово! все хорошо! можете ли вы немного рассказать о скобках? благодаря! – misteryes

+0

@misteryes: Скобки указывают, что команда внутри них должна выполняться в под-оболочке. Под-оболочка создает процесс дочерней оболочки для выполнения предоставленной команды. Результатом является то, что 'tcpdump' становится внуком для вашего скрипта, а не для ребенка. – jxh

+0

так, на самом деле он сразу же передается процессу init, потому что нет реальной суб-оболочки, верно? Я проверил использование 'ps -ef' и узнал, что его родительский pid равен 1 – misteryes

1

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

Я думаю, что вы действительно хотели, чтобы можно было ждать определенного pid. Команда wait принимает необязательный pid. Либо этот раунд должен проверять, когда ожидание возвращает ли процесс, который только что завершился, процесс, который вас интересует, и ждать снова, если это не так.

+0

выполнить команду с exec? Зачем? Я не жду от определенного pid, есть так много дочерних процессов, которые нужно ждать. Я просто надеюсь, что он может подождать весь дочерний процесс, кроме процесса для 'tcpdump' – misteryes

+0

@misteryes: wait может получить массив детского pid. Например, если 'pids' - это массив pids:' wait $ {pids [@]} 'будет ждать завершения всех процессов в pids. Существует несколько способов создания списка сообщений. Вы можете добавить команду '... & pids + = ($!)'. В качестве альтернативы вы можете использовать 'pids = ($ (jobs -p))', чтобы получить массив всех дочерних процессов, а затем удалить pids tcpdump с помощью 'pids_minus_tcpdump = ($ {pids [@]/$ tcpdumppid /})'. –

Смежные вопросы