Saat yalnızca görünür çıkışı izliyor mu?


12

Does watchsadece komuta görünür çıkışını izlemek? Aşağıdaki içeriğe sahip bir dizindeyim:

$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n

Çalıştırırsam watch -g ls -1, bir dosya eklendiğinde veya kaldırıldığında çıkmasını beklerim. Gerçekte olan şey, yalnızca söz konusu dosya aşağıdakilerin terminal çıktısında görünürse çıkmasıdır watch:

$ watch -g ls -1
Every 2.0s: ls -1                   Wed Nov 13 16:35:03 2013

a
b
c
d
e
f

mTerminalimin boyutu nedeniyle görünmeyen dosyayı silmek hiçbir şey yapmaz. Görünür bir dosyanın silinmesi, örneğin beklendiği gibi çıkılmasına dneden olur watch.

-gBayrak benim, bu şekilde açıklanmıştır mansayfa:

   -g, --chgexit
          Exit when the output of command changes.

Neler oluyor? Bu normal mi? watchUzun çıkışlı komutlar için nasıl kullanabilirim ? watch from procps-ng 3.3.4Debian depolarından yüklenmiş olan kullanıyorum .


-gSeçenek ne yapar watch? Benim sürümde bulamıyorumwatch
iruvar

@ 1_CR güncellenmiş soruya bakın, çıktı değiştiğinde çıkmasına neden olmalıdır. Değişiklik ekranda göründüğünde reklamı yapılan şekilde çalışır.
terdon

Yanıtlar:


10

Bu konu başlıklı bulundu: Bug # 225549: watch monitor stderr . Bu konu 2008'den beri, ancak eski sürümlerin STDOUT dışında bir şeyin izlenmesini desteklemediği anlaşılıyor.

Bu yüzden sadece STDOUT ile sınırlıyız. Görünürde çok fazla dil var info watchve man watchbu bana gözleminizin / varsayımınızın doğru olduğunu düşündürüyor.

alıntı

   watch runs command repeatedly, displaying its output (the first screen‐
   full).   This  allows you to watch the program output change over time.
   By default, the program is run every 2 seconds; use -n or --interval to
   specify a different interval.

Ayrıca HATA altında bu bit:

BUGS
       Upon  terminal resize, the screen will not be correctly repainted until
       the next scheduled update.  All --differences highlighting is  lost  on
       that update as well.

Tahmin etsem, görünür bitleri koşular arasında bir tamponda sakladıklarını ve sonra sadece bu karakterleri analiz ettiklerini düşünürdüm.

DÜZENLEME # 1

Ben kullanarak bu ileri debug straceve gördüğünüz watchçıktı okuma lsdahili olarak değişiklik düşüyor böylece komuta.

mdosyayı silmeden önce

$ strace -o w.log watch -g 'ls -1'
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\nw.lo"..., 4096) = 34
close(3)                                = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
munmap(0x7f4da83af000, 4096)            = 0
wait4(31011, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 31011
rt_sigaction(SIGTSTP, {SIG_IGN, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, 8) = 0
write(1, "\33[H\33[2JEvery 2.0s: ls -1\33[1;140H"..., 119) = 119
rt_sigaction(SIGTSTP, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, NULL, 8) = 0
nanosleep({2, 0}, NULL)                 = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4da839f9d0) = 31014
close(4)                                = 0
fcntl(3, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4da83af000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\nw.lo"..., 4096) = 34
close(3)                                = 0
munmap(0x7f4da83af000, 4096)            = 0
--- SIGCHLD (Child exited) @ 0 (0) ---

mdosya silindikten sonra

--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigaction(SIGTSTP, {SIG_IGN, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, 8) = 0
poll([{fd=0, events=POLLIN}], 1, 0)     = 0 (Timeout)
poll([{fd=0, events=POLLIN}], 1, 0)     = 0 (Timeout)
write(1, "\33[1;158H8\33[11;163H", 18)  = 18
rt_sigaction(SIGTSTP, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, NULL, 8) = 0
nanosleep({2, 0}, NULL)                 = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4da839f9d0) = 31028
close(4)                                = 0
fcntl(3, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4da83af000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nn\nw.log\n", 4096) = 32
close(3)                                = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
munmap(0x7f4da83af000, 4096)            = 0
wait4(31028, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 31028

Evet, tuhaf görünüyor, böyle bir şeyi çalıştırmayı imkansız hale getiriyor watch -g foo; echo "Something changed!". Böyle yerleşik bir programda garip bir şekilde sakatlayan bir hata gibi görünüyor.
terdon

@terdon - Fedora'nın eski versiyonumda -ggeçiş yoktu ama Ubuntu'da denedim ve aynı şekilde davranıyor.
slm

Tamam, bu gerçekten garip. Bu yüzden aslında değişimi izler ve görür, buna tepki vermez! Kesinlikle bir böcek sonra.
terdon

2

Bir dosya eklendiğinde veya kaldırıldığında çıkmasını bekliyorum

Eminim inotify araçlarının peşindesin .

Benim manpage seyretmek , gelen PROCPS-ng diyor

watch komutunu tekrar tekrar çalıştırır, çıktısını ve hatalarını gösterir (ilk ekran) .


Sorduğu şey bu değil, meydana gelen bir güncellemenin davranışını anlamaya çalışıyor, STDOUT aracılığıyla görüntüleniyor, ancak değiştirilen çıktının "kapalı olması için yeniden boyutlandırdığı terminal b / c'de görünmüyor. ekran". Bugün bu konuyu tartıştığım herkesin watchOP gibi davranması ve değişiklikten çıkması bekleniyordu .
slm

Evet, daha önce de tartıştık, cevabımda aynı metni vurguladım. Terdon'u oldukça iyi tanıyorum ve bu noktada nedenini bilmek istiyor.
slm

Bu sorunun cevabı olmadığını kabul ediyorum, ama sorunun çözümü.
jthill

İnotify mı demek istiyorsun? Onun peşinde olduğu şey bu değil, neden böyle watchdavrandığını bilmek istiyor . İnotify hakkında bilgi sahibi.
slm

Bu onun sorusu. Onunla yapmaya çalıştığı şey, alıntıladığım şey: bir dosyanın eklenmesini veya kaldırılmasını bekleyin. Watch bu iş için bir araç değil.
jthill
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.