Escute a saída do processo dado pid $$

14

Digamos que eu tenho um pid na mão, mypid=$$

existe algum comando bash / system que eu possa usar para escutar a saída desse processo com o pid fornecido?

Se não existir nenhum processo com mypid, acho que o comando deve simplesmente falhar.

Alexander Mills
fonte
Eu não uso C #, mas, aparentemente, deve haver uma maneira: msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
Alexander Mills
No Unix, é comum aguardar processos filhos usando waito shell ou a wait()função da biblioteca C. Não há maneira padrão de aguardar por um processo não filho do AFAIK. Ainda não está claro se a função C # pode fazer isso (depende do que é um "processo associado").
Kusalananda
Eu poderia fazer isso com polling mas isso seria terrível
Alexander Mills
Também potencialmente daria a você os resultados errados. A reutilização do PID pode, teoricamente, significar que um processo pode ganhar vida com o mesmo PID do processo que você está esperando. No Linux (com PIDs seqüenciais) isso seria improvável , mas em sistemas como o OpenBSD (alocação aleatória de PID), seria um problema.
Kusalananda

Respostas:

19

Eu obtive o que precisava com esta resposta: /programming//a/41613532/1223975

..casa usando wait <pid> só funcionará se esse pid for um processo filho do processo atual .

No entanto, o seguinte funcionará para qualquer processo:

Aguardar a conclusão de qualquer processo

Linux:

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

Darwin (requer que $pidtenha arquivos abertos):

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

Com tempo limite (segundos)

Linux:

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

Darwin (requer que $pidtenha arquivos abertos):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)
Alexander Mills
fonte
Não está relacionado ao Linux, é um recurso do GNU tail. Portanto, ele funcionará em qualquer sistema com o GNU tail como o GNU / Linux, e não funcionará em sistemas não baseados no GNU Linux.
Stéphane Chazelas
Receio que o tail / lsof use a pesquisa nesse caso, pelo menos considerando as evidências empíricas que aparecem dessa maneira no MacOS.
Alexander Mills
lsof + coloca r-lo em modo de repetição, de modo que o comando está repetindo a cada segundo por isso é usando polling, droga
Alexander Mills
3

Você pode usar o bash embutido 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.

Ele usa a chamada do sistema waitpid()..

$ whatis waitpid
waitpid (2)          - wait for process to change state
Derek Callaway
fonte
bom que funciona para mim, espero que não use polling sob o capô, obrigado!
Alexander Mills
1
sim não vai funcionar para o meu caso de uso, eu recebo este erro: bash: wait: pid 47760 is not a child of this shell... de volta à prancheta de desenho lol
Alexander Mills
Eu tenho resposta, eu só postou isso thx
Alexander Mills
1
Isso aguardará apenas processos filho, não por um processo não associado ao processo atual.
Kusalananda