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.
waitwait()
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.
waitwait()
Yanıtlar:
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:
Linux:
tail --pid=$pid -f /dev/null
Darwin ( $pidaçık dosyaları olmasını gerektirir ):
lsof -p $pid +r 1 &>/dev/null
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)
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
bash: wait: pid 47760 is not a child of this shell... lol çizim tahtasına geri lol
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.