STDOUT'a hangi sürecin yazıldığını nasıl öğrenebilirim?


19

Bir işlemin iki örneği var. Bunlardan biri "frEAkIng oUT!" ve baskı hataları STDOUT için durmaksızın.

Kırık süreci öldürmek istiyorum ama yanlış olanı sonlandırmadığımdan emin olmalıyım. İkisi de aynı anda başlatıldı ve topher ikisini de kullandığımda, aynı miktarda bellek ve CPU kullandıklarını görebiliyorum. Sürecin kötü davrandığını gösteren hiçbir şey bulamıyorum.

En güvenli şey STDOUT'a hangi işlem / pid'in yazdığını bulmak olacaktır.

Bunu yapmanın bir yolu var mı?


1
Stdout'a yazmak, dosya tanımlayıcısına 1 ((söz konusu işlemin) bir terminal veya benzeri bir şey olabilir) yazmak anlamına gelir /dev/null. Bunun yerine belirli bir dosyayı (terminal cihazı veya günlük dosyası gibi) kastetmediğinizden emin misiniz ?
Stéphane Chazelas

Her ikisi de aynı kabukta başlamışlarsa, ikisi de STDOUT'a yazıyorlar, bu yüzden bunu sabitlemek 2'den hangisini öldüreceğinizi belirlemenize yardımcı olmaz. Jofel'in yöntemi muhtemelen aradığınız şeydir.
slm

Gerçekten kastettiği, hangisinin terminalde çıkış ürettiği .
Barmar

Yanıtlar:


17

Linux'ta, kabuğunuzun stdout'unun bağlı olduğu kaynakla aynı kaynağa ne yazdığını bilmek istediğinizi varsayarsak, şunları yapabilirsiniz:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

Bu write(), kabuğunuzun fd 1'i ile aynı dosyada en az bir dosya tanımlayıcısı açık olan her işlemin sistem çağrılarını (herhangi bir dosya tanımlayıcıda) rapor eder .


Aklıma ilk başta gelen buydu, ikinize de her iki yöntemi de deneyeceğim.
TCZ8

23

Onları SIGSTOP (fiili tarafından PID1 ve PID2 yerine göndererek hem işlemeyi durdurabilirsiniz PID'leri veya kullanım killallve uygulama adı):

kill -SIGSTOP pid1 pid2

Terminaldeki (veya stdout'un yönlendirildiği her yerde) yazdırma işlemi durmalıdır. Sonra bunlardan birini kullanarak

kill -SIGCONT pid1

Hata mesajları hemen görünürse, ilk işlem olduğunu bilirsiniz. Değilse tekrar durdurabilir ve ikincisine devam edebilirsiniz ...

Durdurulmuş bir işlemi öldürmeden önce, ilk SIGCONT'u göndermek iyi bir uygulamadır.

Aynı teknik ile kullanılabilir Ctrl-Zve kabuk iş kontroller ( fg %1, bg %1, kill %1, ...).


1
Bu sorun gidermek için çok iyi bir yol ama gerçekten kim terminal yazıyor izlemek için bir yol arıyordu. Teşekkür ederim
TCZ8

Bu soruyu tekrar okuyordum, son yorumumu yazarken beyin osuruğu vardı gibi görünüyor. Bu da sorunumu çözerdi. Teşekkür.
TCZ8
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.