क्या केवल दृश्यमान आउटपुट की निगरानी करता है?


12

क्या watchकेवल कमांड के दृश्यमान आउटपुट की निगरानी करता है ? कहो मैं निम्नलिखित सामग्री के साथ एक निर्देशिका में हूँ:

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

यदि मैं चलाता watch -g ls -1हूं तो मैं यह अपेक्षा करता हूं कि यदि कोई फ़ाइल जोड़ी जाती है या निकाली जाती है तो वह बाहर निकल जाएगी। वास्तव में क्या होता है कि यह तभी बाहर निकलता है जब विचाराधीन फ़ाइल टर्मिनल आउटपुट में दिखाई देती है watch:

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

a
b
c
d
e
f

फ़ाइल को हटाना m, जो मेरे टर्मिनल के आकार के कारण दिखाई नहीं देता है, कुछ भी नहीं करता है। एक दृश्यमान फ़ाइल को हटाना, कहना d, watchअपेक्षा के अनुसार बाहर निकलने का कारण बनता है।

-gझंडा मेरे में thusly समझाया गया है manपेज:

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

क्या चल रहा है? क्या यह सामान्य है? मैं watchलंबे आउटपुट के साथ कमांड के लिए कैसे उपयोग कर सकता हूं ? मैं उपयोग कर रहा हूं watch from procps-ng 3.3.4जो डेबियन रिपोज से स्थापित किया गया था।


क्या -gकरने का विकल्प watchहै? मुझे यह मेरे संस्करण में नहीं मिलता हैwatch
iruvar

@ 1_CR अपडेट किए गए प्रश्न को देखें, आउटपुट बदलने पर इसे बाहर निकलने का कारण बनाना चाहिए। स्क्रीन पर परिवर्तन दिखाई देने पर यह विज्ञापित के रूप में काम करता है।
terdon

जवाबों:


10

मुझे यह थ्रेड शीर्षक मिला: बग # 225549: वॉच मॉनिटर स्टादर है । यह धागा 2008 से है, लेकिन ऐसा लगता है कि पुराने संस्करण STDOUT के अलावा और कुछ देखने का समर्थन नहीं करते हैं।

इसलिए हम सिर्फ STDOUT तक सीमित हैं। जैसा कि दृश्यमान है कि इसमें बहुत सी भाषा है info watchऔर man watchइससे मुझे लगता है कि आपका अवलोकन / धारणा सही है।

अंश

   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.

BUGS के तहत भी यह बिट:

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.

अगर मुझे लगता था कि मुझे लगता है कि वे रनों के बीच बफर में दृश्य बिट्स को संग्रहीत कर रहे थे, और फिर उन पात्रों का विश्लेषण कर रहे थे।

EDIT # 1

मैंने इसे आगे प्रयोग करके डिबग किया straceऔर आप कमांड watchको आउटपुट से पढ़ते हुए देख सकते हैं , lsइसलिए यह आंतरिक रूप से बदलाव को छोड़ रहा है।

mफ़ाइल को हटाने से पहले

$ 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) ---

mफ़ाइल को हटाने के बाद

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

हाँ, यह सिर्फ अजीब लगता है, यह असंभव है जैसे कुछ चलाना watch -g foo; echo "Something changed!"। यह इस तरह के एक स्थापित कार्यक्रम में एक अजीब अपंग बग लगता है।
terdon

@terdon - फेडोरा के मेरे प्राचीन संस्करण में -gस्विच नहीं था, लेकिन मैंने इसे उबंटू पर आज़माया और यह वही व्यवहार करता है।
स्लम

ठीक है, यह वास्तव में अजीब है। तो यह वास्तव में निगरानी करता है और परिवर्तन को देखता है, यह सिर्फ इस पर प्रतिक्रिया नहीं करता है! निश्चित रूप से एक बग तो।
terdon

2

मुझे उम्मीद है कि अगर कोई फ़ाइल जोड़ी जाती है या निकाली जाती है तो वह बाहर निकल जाता है

मुझे यकीन है कि तुम inotify-tools के बाद हो ।

के लिए मेरे मैनपेज घड़ी , से procps-एनजी कहते हैं,

वॉच रन बार-बार करता है, इसके आउटपुट और एरर (पहला स्क्रीनफुल) प्रदर्शित करता है ।


यह वह नहीं है जिसके बारे में वह पूछ रहा है, वह एक अपडेट के व्यवहार को समझने की कोशिश कर रहा है, STDOUT के माध्यम से प्रदर्शित किया जा रहा है, लेकिन टर्मिनल b / c में दिखाई नहीं दे रहा है, वह इसे फिर से आकार दे रहा है ताकि जो आउटपुट बदल रहा है वह "बंद" हो स्क्रीन "। आज के साथ मैंने जिन सभी पर चर्चा की है watch, उन्होंने ओपी के रूप में व्यवहार करने और बदलाव के साथ बाहर निकलने की उम्मीद की है।
स्लम

हां, हम पहले ही चर्चा कर चुके हैं, मैंने अपने उत्तर में उसी पाठ को उजागर किया है। मैं टेर्डन को अच्छी तरह से जानता हूं और इस बिंदु पर वह कारण जानना चाहता है।
SLM

मैं मानता हूं कि यह उनके सवाल का जवाब नहीं है, लेकिन यह उनकी समस्या का समाधान है।
jthill

तुम inotify का उपयोग मतलब है? यही कारण है कि वह उसके बाद नहीं है, वह जानना चाहता है कि watchइस तरह से व्यवहार क्यों किया जाता है। वह इनोटिफाई के बारे में जानता है।
SLM

यही उसका सवाल है। वह इसके साथ क्या करने की कोशिश कर रहा है जो मैंने उद्धृत किया है: एक फ़ाइल को जोड़ने या हटाने के लिए प्रतीक्षा करें। देखो उस काम के लिए उपकरण नहीं है।
jthill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.