Які команди я використовував би для створення двох дочірніх процесів послідовно?


8

Я хочу породити два дочірні процеси, але дочекайтеся, коли перший досягне певного моменту його виконання (який можна визначити, вивчивши stdout), перш ніж нерестувати другий. Я не впевнений, які команди Unix братимуть участь у цьому, і мені важко було знайти що-небудь через google через лаконічний та інколи критичний характер імен команд unix.

Я не шукаю вирішення конкретної проблеми, яку я намагаюся вирішити (хоча будь-які додаткові вказівники були б вдячні), я в першу чергу переймаюся тим, щоб знати, які команди Unix я хочу шукати та навчитися використовувати.


Ви готові використовувати Python?
xrisk

3
Не знаючи, як ви визначаєте "певний момент у його виконанні", це дуже розпливчасто.
муру

@muru відредаговано для уточнення
w.brian

Тож вам справді потрібні 3 процеси. 1. працює, створюючи вихід; 2. контролює вихід 1, а в певний момент починається 3. Цього достатньо інформації, щоб ви почали робити все, що ви робите. Але це не дуже вдалий спосіб проектування програми.
djsmiley2kStaysInside

Відповіді:


7

Для цього можна скористатися xargsутилітою. Він може запускати команду для кожного рядка на stdin, тому нам просто потрібно переконатися, що xargsотримує як введення один рядок на stdin в той момент, коли він повинен запустити команду, що може бути виконано за допомогою grep:

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2

Аргументи --max-count=1, --max-lines=1і --no-run-if-emptyгарантувати , що proc2буде працювати тільки один раз , якщо і коли proc1виходи ${targetString}в перший раз, і ніколи , якщо в proc1жодному разі не вихід ${targetString}. У --replaceуникає , що xargsдодає рядок введення в його командному рядку.

Я використовував такий командний рядок, щоб перевірити його:

(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"

1
+1 Це дуже творча відповідь. Це буде набагато складніше, хоча вам потрібен решта результатів від proc1. Вам потрібно буде використовувати такі речі, як трійник та додаткові дескриптори файлів або названі труби.
Джо

7

Я не впевнений, що є елегантна команда / відповідь на поставлене вами питання (тобто досягти певної точки в його виконанні) - але є інструменти / методи, які можна використовувати для пошуку рішення, ймовірно, що включає більше 1 з наступне, а може й інші речі, про які я ще не знаю:

  1. Фонові процеси (&)
  2. Умовне виконання (&& та ||)
  3. спати
  4. зачекайте (я очікую, що це буде особливо корисно - якщо ви запустите більше 1 завдання у фоновому режимі, він буде чекати, поки всі завдання будуть виконані)
  5. Названі труби (які могли б забезпечити механізм розмови між процесами).
  6. inodenotifywait

Написання та перевірка файлів блокування також є звичайною практикою (підказка - якщо у вас є контроль над середовищем, пишіть на ramdisk, а не / tmp - у багатьох дистрибутивах це / dev / shm).


6

Це лише ідея, але у першої технологічної труби її вихід буде зафіксований. Запропонуйте висновку grep pipe до циклу читання рядків і порівняйте кожен рядок із тим, що шукаєте. Після виявлення виконайте proc2.

#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
    proc2
fi
done

Якщо "певний момент у його виконанні" можна визначити stdout, то як щодо наступного?

proc1 | grep "stdout trigger string" && proc2

&&повинен стріляти, коли grepповертається 0, що робить лише тоді, коли знаходить відповідність.


1
grep буде тривати, поки stdin не закриється. До цього він нічого не поверне (0 чи інше).
Боб

@Bob О, дякую ... Я спробую перефразувати цю думку.
Луї Ваверу

@bob Це було б особливо брудно і нерозбірливо, і неправильне використання інструменту, але ви можете використовувати fail2ban для моніторингу файлу журналу (тобто трубопроводу до файлу), а потім запрограмуйте правило для виконання другого скрипту, коли цей рядок знайшов (але я Recon зміна файлу запуску і використання Inotify є більш елегантне рішення)
davidgo

1
Якщо targetstring трапляється більше разів у виході proc1, proc2 буде запускатися кілька разів. Якби ви це зробили proc2 &і тоді break, цього не сталося, але це закрило б трубу і змусило б процес припинення достроково припинити. Крім того, ви можете встановити прапор після запуску proc2 і використовувати його, щоб переконатися, що proc2 не запускається знову. Як і в іншій відповіді, решта результатів proc1 відкидається, тому якщо вам це потрібно, потрібно більше роботи.
Джо

1
@Joe Добре. Початкове запитання насправді було лише запитанням про те, з якими командами можна працювати, тому це справді лише відповідь, що демонструє потенціал деяких команд (головним чином |і grepтут).
Луї Ваверу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.