Verilen pid işleminin çıkışını dinleyin $$


16

Elimde bir pid var, mypid=$$

verilen pid ile bu işlemin çıkışını dinlemek için kullanabileceğim bazı bash / system komutu var mı?

Mypid ile herhangi bir işlem yoksa, sanırım komutun başarısız olması gerekir.


C # kullanmıyorum, ama görünüşe göre bir yol olmalı: msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
Alexander Mills

Unix'te, kabukta veya C kitaplığı işlevinde kullanarak alt işlemleri beklemek yaygındır . AFAIK, çocuk olmayan bir süreci beklemenin standart bir yolu yoktur. Ayrıca C # işlevinin bunu yapıp yapamayacağı da belirsizdir ("ilişkili işlem" in ne olduğuna bağlıdır). waitwait()
Kusalananda

Oylama ile bunu yapabilirdim ama bu korkunç olurdu
Alexander Mills

Ayrıca potansiyel olarak size yanlış sonuçlar verir. PID'nin yeniden kullanımı teorik olarak bir sürecin beklediğiniz işlemle aynı PID ile canlanabileceği anlamına gelebilir. Linux'ta (sıralı PID'lerle) bu olası değildir , ancak OpenBSD (rastgele PID tahsisi) gibi sistemlerde bu bir sorun olacaktır.
Kusalananda

Yanıtlar:


21

Bu yanıttan ihtiyacım olanı aldım: https://stackoverflow.com/a/41613532/1223975

.. kullanarak wait <pid> sadece bu pid mevcut sürecin bir alt süreci ise kullanarak çalışır .

Ancak aşağıdakiler herhangi bir işlem için işe yarayacaktır:

Herhangi bir işlemin bitmesini beklemek için

Linux:

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

Darwin ( $pidaçık dosyaları olmasını gerektirir ):

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

Zaman aşımı ile (saniye)

Linux:

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

Darwin ( $pidaçık dosyaları olmasını gerektirir ):

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

Linux ile ilgili değil, GNU kuyruğunun bir özelliği. Bu yüzden GNU / Linux gibi GNU kuyruğu olan herhangi bir sistemde çalışacak ve GNU olmayan Linux tabanlı sistemlerde çalışmaz.
Stéphane Chazelas

Bu durumda tail / lsof'un yoklama kullanacağından korkuyorum, en azından MacOS'ta göründüğü ampirik kanıtlar göz önüne alındığında.
Alexander Mills

lsof + r tekrarlama moduna sokar, böylece komut her saniyeyi tekrarlar, böylece yoklama, lanet olası kullanır
Alexander Mills

3

Bash yerleşkesini kullanabilirsiniz 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.

Sistem çağrısını kullanır waitpid().

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

benim için iyi çalışıyor, umarım kaputun altında yoklamayı kullanmaz, teşekkürler!
Alexander Mills

1
evet benim kullanım durumum için çalışmaz, bu hatayı alıyorum: bash: wait: pid 47760 is not a child of this shell... lol çizim tahtasına geri lol
Alexander Mills

Cevabım var, ben sadece thx gönderdim
Alexander Mills

2
Bu, yalnızca alt süreçleri bekler, mevcut işlemle ilişkilendirilmemiş bir işlemi beklemez.
Kusalananda

1

Alexander Mills'in yayınladığı https://stackoverflow.com/a/41613532/1223975 çözümü ile ilgili olarak, GNU'su olmayan Timeout in Seconds DarwinUNIX benzeri bir işletim sistemi için bir çözümdür tail. Belirli değildir Darwin, ancak UNIX benzeri işletim sisteminin yaşına bağlı olarak, sunulan komut satırı gerektiğinden daha karmaşıktır ve başarısız olabilir:

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

En az bir eski UNIX'te, lsofargüman +r 1m%sbaşarısız olur (bir süper kullanıcı için bile):

lsof: can't read kernel name list.

Bu m%sbir çıktı biçimi belirtimidir. Daha basit bir son işlemci gerektirmez. Örneğin, aşağıdaki komut PID 5959'da beş saniyeye kadar bekler:

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

Bu örnekte, PID 5959 beş saniye geçmeden kendi isteğinden çıkarsa, ${?}olur 0. Değilse beş saniye sonra ${?}geri döner 1.

Ayrıca açıkça o in dikkati olabilir +r 1, 1duruma uygun şekilde değiştirilebilir, böylece (saniye) anket aralığıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.