Ç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.