Как передать PID одного процесса другому процессу в том же сценарии оболочки?

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

#!/bin/sh PROCESS1 & PROCESS2 & PROCESS3 & 

Здесь проблема. Мне нужно запустить эти процессы в том же порядке, как показано на рисунке. Кроме того, PID PROCESS2 должен быть передан в качестве аргумента командной строки в PROCESS3. Все эти процессы выполняются в бесконечном цикле и работают гладко, когда запускаются в 3 отдельных терминалах.

Я старался:

 #!/bin/sh PROCESS1 & PROCESS2 & PID_PROCESS2=$! PROCESS3 ${PID_PROCESS2} & 

Это запускает PROCESS1 и PROCESS3, но PROCESS2 завершает работу немедленно, не печатая никаких ошибок. Это просто исчезает. Команда ps не показывает никаких следов PROCESS2. Печать PID_PROCESS2 дает некоторое значение «p», и PROCESS3 прекрасно работает со значением «p» в качестве аргумента. В чем проблема и где мне не хватает?

ВЕРОЯТНО ВАЖНЫЕ ДЕТАЛИ

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

 #!/bin/sh /usr/bin/PROCESS1 & 

Вывод ps такой, как описано выше,

 $ps | grep "/path/to/PROCESS" 10064 root 16536 S /path/to/PROCESS1 10066 root 11084 S /path/to/PROCESS3 10065 

который ясно говорит, что PROCESS2 запущен, но вышел по неизвестной причине.

2) PROCESS2 связывается с PROCESS1 через FIFO (именованный канал), и это односторонняя связь.

Временное решение

 #/bin/sh /path/to/PROCESS1 & /path/to/PROCESS2 & PROCESS2_PID=$! export P2PID=${PROCESS2_PID} sh -c "/path/to/PROCESS3 ${P2PID}" 

Это, кажется, делает работу с одним дополнительным процессом для sh.

 $ps | grep "/path/to/PROCESS" 10174 root 16536 R /path/to/PROCESS1 10175 root 71720 S /path/to/PROCESS2 10177 root 27772 S sh -c /path/to/PROCESS3 10175 10076 root 11084 S /path/to/PROCESS3 100175 

Но я до сих пор понятия не имею, почему это работает. Кто-то может подсказать, что за «магия» произошла в этом случае?

One Solution collect form web for “Как передать PID одного процесса другому процессу в том же сценарии оболочки?”

Исходя из того, что вы описываете, звучит так, будто с PROCESS2 что-то в корне не так, что заставляет его выходить. Если я моделирую то, что вы описываете, с помощью 3 процессов, это в основном работает так, как можно было бы ожидать, когда вы создадите фон для 3 процессов, а затем получите и передадите PID 2-го процесса процессу 3.

пример

пример сценария

 $ cat runny.bash #!/bin/bash proc3func() { echo $1 sleep 7 & } sleep 9 & sleep 8 & PID2=$! proc3func ${PID2} & 

пример запуска

 $ ./runny.bash ; sleep 2; ps -eaf 4279 UID PID PPID C STIME TTY TIME CMD ... vagrant 4278 1 0 20:21 pts/1 00:00:00 sleep 9 vagrant 4279 1 0 20:21 pts/1 00:00:00 sleep 8 vagrant 4282 1 0 20:21 pts/1 00:00:00 sleep 7 

В приведенном выше выводе мы можем видеть PID, 4279, отображаемый на экране, а затем вывод ps -eaf который показывает наши 3 процесса.

отладка

Я бы предложил включить set -x чтобы вы могли следить за тем, какие команды выполняются, когда вы запускаете скрипт или запускаете его так:

 $ bash -x ./runny.bash + PID2=4612 + sleep 9 + sleep 8 + proc3func 4612 + echo 4612 4612 + sleep 7 
Interesting Posts

Ошибка Kino: ПРЕДУПРЕЖДЕНИЕ: модуль ядра dv1394 не загружен или отсутствует чтение / запись / dev / raw1394 на Fedora 20, dvgrab works

Восстановление использования ключей управления громкостью после удаления pulseaudio

Корневой дом не / root на моем debian?

Почему мне нужен размер фреймбуфера больше размера монитора, когда область назначения преобразования меньше

Как безопасно извлечь ненадежный tar-файл?

не удается найти интерпретатор при запуске исполняемого файла Windows

Постоянное отслеживание статуса обслуживания

Как использовать awk для отступов исходного файла на основе простых правил?

Как запустить клиентский скрипт на удаленном хосте и получить результаты для клиента

Используя rsync для инкрементного резервного копирования, что происходит, когда оригинальная полная резервная копия должна быть удалена?

Остановите колесо мыши на клавиатуре вниз

Менеджер входа в SLIM Заставляет окно Urxvt потерять эффект прозрачности / непрозрачности

Проблемы с установкой PCRE на ubuntu

Справка Grep regex нужна

Что я делаю неправильно, пытаясь написать сценарий bash, который возвращает номер следующего доступного порта?

Linux и Unix - лучшая ОС в мире.