Aslında bu tür şeylerin başka bir yanıt yapılabilir olabilir tam olarak nasıl göstermek burada . Bu yanıt, 2 günlükün bir arka plan işlemi tarafından korunmasını sağlamakla ilgili bir soruydu, bu yüzden 10 ile gösterdim.
Demo Komut Dosyası
cat <<-\DEMO >|${s=/tmp/script}
printf 'tty is %s\nparent pid is %s\npid is pid=%s\n' \
"$(tty)" "$PPID" "$$"
exec 1>&2 ; nums=$(seq 0 9)
rm ${files=$(printf "/tmp/file%s\n" $nums)}
for n in $nums ; do { for f in $files ; do
echo "Line $n" >>"$f" ; done
sleep 1 ; } ; done
#END
DEMO
Demoyu Çalıştır
s=/tmp/script ;chmod +x $s ;info="$(($s &)2>&- &)"
echo "$info" ; pid="${info##*=}" ; echo
while ps -p $pid >/dev/null ; do sleep 3 ; done
for f in /tmp/file[0-9] ; do
printf 'path : %s\tline count : %s\n' \
$f $(<$f wc -l)
done
Çıktı:
tty is not a tty
parent pid is 1
pid is 12123
path : /tmp/file0 line count : 10
path : /tmp/file1 line count : 10
path : /tmp/file2 line count : 10
path : /tmp/file3 line count : 10
path : /tmp/file4 line count : 10
path : /tmp/file5 line count : 10
path : /tmp/file6 line count : 10
path : /tmp/file7 line count : 10
path : /tmp/file8 line count : 10
path : /tmp/file9 line count : 10
Yukarıda gösterilmiştir. Adında bir komut dosyası oluşturur ve çalıştırır /tmp/script
, chmod
' yürütülebilir olarak ' ve &background
bir &backgrounded ( subshell )
.
Senaryo rms /tmp/file0-9
10 dosya ve 10 echoes
saniyede bir satır. Ben $info
inkâr edilmemiş süreç bazı yakalama $(command substitution). While ps
ve $pid
ben yakalama hakkında hala raporlar aracılığıyla sunmak , ben hala çalışır biliyorum böylece I sleep.
Tamamlandığında, 10 dosyadaki satırları ile sayılırwc.
Bir süreci bu şekilde çağırdıktan sonra, orijinal ana sürecini özgürce kapatabilirsiniz ve bu da kamyon taşımacılığına devam eder - etkili bir şekilde reddedilir. Bu aynı zamanda geleneksel kullanamazsınız demektir wait
komutu, ancak bekleyen ps
bireyin karşılığında her durumda daha sağlam olmalıdır.
Bahsetmeye değer, bence, süreç aslında başlangıçta çağrılıyor $(command substitution)
ve printfs
ben de $info
istiyorum, böylece onu etkili bir şekilde kontrol edebiliyorum. Ama onun uç çıkışını düşer kısa sürede exec 1>&2
(ki ile aynı alt kabukta kapalıdır 2>&-
), süreç kaçar ve ben diğer ucunda bunun için beklemek zorunda. Her iki dünyanın da en iyisi, özellikle de giriş borularını işlemek için kullanırsanız, zihninizi tüm yönlendirmeler ve süreç liderlerinin etrafına sarabilirsiniz.
Diğer her şey sadece burada gösteri içindir. Bunu çalıştırmak için tek ihtiyacınız olan en iyi komut dosyası ve:
info="$(($script_path &)2>&- &)"
NOT: Bu yalnızca tam olarak göstermek istediğimi terminale yazdırır. Belirtildiği gibi,$PPID,
bu işlem terminal tarafından reddedilir ve doğrudan bir çocuktur.$PID 1.
Bunlardan ikisini aynı anda çalıştırmak ve onları beklemek isterseniz, ps
her iki pidesini de teslim edebilir ve bekleyebilirsiniz.