Çalışan bir işlemin STDOUT yönlendirmesine bakın


17

Bir uygulamayı bu komutla başlatırsam:

/path/to/my/command >> /var/log/command.log

Ve komut geri dönmez, başka bir istemden STDOUT yönlendirmesinin neye ayarlandığını görmenin bir yolu var mı?

Ben de böyle bir şey arıyorum

cat /proc/PID/redirects

veya

ps -??? | grep PID

ancak herhangi bir yöntem işe yarayacaktır.

Yanıtlar:


22

İçindeki 1 numaralı dosya tanımlayıcısına (STDOUT) bakın /proc/$PID/fd/. Çekirdek, bu dosyayı tanımlayıcının yönlendirildiği bir dosyaya sembolik bağlantı olarak gösterir.

$ readlink -f /proc/20361/fd/1
/tmp/file

Mükemmel! Teşekkürler! STDERR gibi diğer yönlendirmeler hakkında bir bağlantı veya ayrıntı verebilir misiniz, yani bunlar hangi sayılardır?
— Zengin

En azından Linux'ta (ve bilinen tüm UNIX benzeri işletim sistemlerine inanıyorum) bunlar 0: stdin, 1: stdout, 2: stderr (standart hata). Ayrıca <stdio.h> içinde tanımlanan C makroları olduğuna dikkat edin: STD {IN, OUT, ERR} _FILENO. Ayrıntılar için 'man stdout'a bakınız.
— Petr Uzel

Stdin, stdout ve stderr için 0, 1, 2, tüm Unix / Unix benzeri sistemlerde garanti edilir ve Windows için de geçerlidir.
— Paul Stelian

MacOS'ta bunu yapmanın herhangi bir yolu var mı? / proc / <pid> / fd / 1 mevcut değil, belki mkfifo kullanabilirim?
— Alexander Mills

4

Hangi dosyaların hangi işlemler tarafından açıldığını görmek için kullanışlı bir araç lsof. Belirli bir işlemle işaret edebilir lsof -p1234ve çoğunlukla ls -l /proc/1234/fdLinux altında elde edebileceğiniz bilgilerin aynısını , yani hangi dosyaların açıldığını görürsünüz .

En yararlı şey ters lsofyönde ilerlemektir: lsof /path/to/filebu işlemin hangi işlemlerin kullanıldığını gösterir.


1

Birçok cevap bu şekilde yapıldığından bahsediyor:

tail -f /proc/{PID}/fd/1

Ancak, bunun her zaman işe yaramadığını gördüm. Alternatif olarak, catbazen sonuç verir.

cat /proc/{PID}/fd/1

burada {PID} ps auxkomutu kullanılarak aranabilir .

Ayrıca, komutun sonundaki sayının (bu durumda fd / 1) diğer çıkışlar için değiştirilebileceği de belirtilmelidir.

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
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.