Reddetme komutunu doğrulayın


10

^z; bg; disownDiziyi, çok önemli ve uzun süren bir işlem yürüttüğüm bir ssh oturumunu kapatmama izin vermek için yayınladım . Bu işlem durum çıkışını stderr'a yazar ve ayrıldıktan sonra bile bunu yapmaya devam eder (lsof ile doğrulanır, stderr fd r / w için açıktır).

Sürecin gerçekten reddedildiğini belirlemenin bir yolu var mı (kabuk bir tane alırsa SIGHUP'u geri getirmeyecek)?



2
Sadece merak ediyorum, neden olmasın: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Yanıtlar:


12

Bash'te disownkendi başına verilen komut , arka plandaki ( bgveya yoluyla &) işlemleri etkin iş tablosundan kaldıracak ve oturum kapatıldığında SIGHUP almayacak şekilde işaretleyecektir.

Ayrıca beğenmemek için bir veya daha fazla işi geçirebilirsiniz disown 1 3. disown -hBayrak Tabloda işler tutmak istiyorsanız yararlıdır, ancak yine de çıkış yapınca SIGHUP değil.

jobsKomutu vererek iş tablosunu görüntüleyebilirsiniz . Başarılı bir arka plandan sonra gösterecektir [1]+ command &. Bir işi reddettikten sonra, artık iş tablosunda gösterilmemeli ve artık çıkışta öldürülmemelidir. Hala aracılığıyla sürecini görüntüleyebilir ps ux, topve diğer işlem görüntüleme araçları.

Bir iş reddedildikten sonra, işin doğal olarak sona ermesini bekleyebilir veya killdurdurmak için PID'ye bir sinyal gönderebilirsiniz .

Bash işi sonlandırmak için çalışmakta olan işler listesinden çıkardığı ve terminalinizin stdout ve stderr'ındaki dosya tanıtıcıları hala açık olduğundan, terminal cihazınız kapanana kadar işten çıktı almaya devam edersiniz (çıkış yaptığınızda) .

Örnekler:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Genellikle yalnızca veya disowngibi uzun süre çalışan bir komut çalıştırırsam ve daha sonra sonlandırmadan oturumu kapatmam gerektiğine karar veririm. Bir komut çalıştıracağınızı ve oturumu kapatacağınızı biliyorsanız, çıktıyı bir dosyaya borulandırarak veya işleyerek, çalıştırarak veya içinde çalıştırarak yakalayabilirsiniz (bu, komutun sahipliğini yeniden almanıza / daha sonra sonlandırmanıza olanak tanır) ).rsynccpteenohupscreen

Örnekler:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null

1
+1 Bilgilendirici ve örneklerle. Güzel!
Andy Smith

Çok bilgilendirici yorum; bir sürecin ayrılmasını doğrulamanın mümkün olmadığını mı söylüyorsunuz (iş tablosunda artık mevcut olmadığını belirtmenin yanı sıra)?
mikewaters

1
detacharka planlı bir işte çalıştırdığınızda , ayrılacak :) orada arka planlı bir süreçte çalıştırmanın hiçbir şey yapmayacağı bir orta yol yoktur. kontrol jobssadece bir durdurulmuş süreci falan ayırmak için deneyin vermedi doğrular.
lunixbochs
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.