Прослухайте вихід процесу, що надається pid $$


16

Скажіть, я маю підручку в руці, mypid=$$

Чи є якась команда bash / system, яку я можу використовувати, щоб слухати вихід цього процесу з даним pid?

Якщо жодного процесу з mypid не існує, я думаю, що команда повинна просто вийти з ладу.


Я не використовую C #, але, мабуть, повинен бути спосіб: msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
Олександр Міллз

У Unix прийнято чекати дочірніх процесів, використовуючи waitоболонку або функцію wait()бібліотеки С. AFAIK не має стандартного способу очікування процесу, що не стосується дитини. Далі незрозуміло, чи може це зробити функція C # (це залежить від того, що таке "асоційований процес").
Kusalananda

Я міг би це зробити за допомогою опитування, але це було б жахливо
Олександр Міллз

Це також може призвести до неправильних результатів. Повторне використання PID теоретично може означати, що процес може оживати з тим самим PID, що і процес, якого ви очікуєте. Для Linux (із послідовними PID) це було б малоймовірно , але в таких системах, як OpenBSD (рандомізоване розподілення PID), це було б проблемою.
Kusalananda

Відповіді:


21

Я отримав те, що мені потрібно з цієї відповіді: https://stackoverflow.com/a/41613532/1223975

..виключення використання wait <pid> буде працювати лише в тому випадку, якщо цей під є дочірнім процесом поточного процесу .

Однак для будь-якого процесу буде працювати наступне:

Дочекатися закінчення будь-якого процесу

Linux:

tail --pid=$pid -f /dev/null

Дарвін (вимагає, щоб у $pidньому були відкриті файли):

lsof -p $pid +r 1 &>/dev/null

З таймаутом (секунди)

Linux:

timeout $timeout tail --pid=$pid -f /dev/null

Дарвін (вимагає, щоб у $pidньому були відкриті файли):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

Це не пов'язано з Linux, це особливість хвоста GNU. Таким чином, вона працюватиме в будь-якій системі з хвостою GNU, як у GNU / Linux, і не працюватиме на системах, що не базуються на GNU Linux
Стефан Шазелас

Я побоююсь, що хвіст / lsof використовуватиме опитування в цьому випадку, принаймні з огляду на емпіричні докази, що так виглядає на MacOS.
Олександр Міллс

lsof + r переводить його в повторний режим, так що команда повторюється щосекунди, тому вона використовує опитування, чорт забирає
Олександр Міллз

3

Ви можете використовувати bash вбудований wait:

$ sleep 10 &
[2] 28751
$ wait 28751
[2]-  Done                    sleep 10
$ help wait
wait: wait [-n] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in that job's pipeline.

    If the -n option is supplied, waits for the next job to terminate and
    returns its exit status.

    Exit Status:
    Returns the status of the last ID; fails if ID is invalid or an invalid
    option is given.

Він використовує системний виклик waitpid()..

$ whatis waitpid
waitpid (2)          - wait for process to change state

приємно, що працює для мене, сподіваюся, не використовує опитування під капотом, дякую!
Олександр Міллз

1
так, не буде працювати для мого випадку використання, я отримую цю помилку: bash: wait: pid 47760 is not a child of this shell... повернутися до креслярської дошки lol
Олександр Міллз

У мене є відповідь, я щойно опублікував це thx
Олександр Міллз

2
Це буде чекати лише дочірніх процесів, а не процесів, не пов'язаних з поточним процесом.
Kusalananda

1

Щодо рішення https://stackoverflow.com/a/41613532/1223975, яке Олександр Міллс повторно відмітив, Timeout in Seconds Darwin- це рішення для ОС, схожої на UNIX, яка не має GNU tail. Це не конкретно Darwin, але, залежно від віку операційної системи, схожої на UNIX, запропонований командний рядок є складнішим, ніж необхідно, і може вийти з ладу:

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

Принаймні на одному старому UNIX lsofаргумент +r 1m%sне вдається (навіть для суперпользователя):

lsof: can't read kernel name list.

Це m%sспецифікація формату виводу. Простіший постпроцесор цього не вимагає. Наприклад, наступна команда чекає на PID 5959 до п'яти секунд:

lsof -p 5959 +r 1 | awk '/^=/ { if (T++ >= 5) { exit 1 } }'

У цьому прикладі, якщо PID 5959 закінчується за власним бажанням до того, як минуть п'ять секунд, ${?}це 0. Якщо не ${?}повертається 1через п’ять секунд.

Вона також може бути варто прямо зазначити , що в +r 1, то 1є інтервал опитування (в секундах), так що він може бути змінений відповідно до ситуації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.