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.
wait
wait()
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.
wait
wait()
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 ( $pid
açık dosyaları olmasını gerektirir ):
lsof -p $pid +r 1 &>/dev/null
Linux:
timeout $timeout tail --pid=$pid -f /dev/null
Darwin ( $pid
açı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
Darwin
UNIX 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, lsof
argüman +r 1m%s
başarısız olur (bir süper kullanıcı için bile):
lsof: can't read kernel name list.
Bu m%s
bir çı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
, 1
duruma uygun şekilde değiştirilebilir, böylece (saniye) anket aralığıdır.