यदि कोई कमांड चल रहा है या उपयोगकर्ता इनपुट की प्रतीक्षा कर रहा है, तो मैं कैसे बताऊँ?


14

कमांड लाइन पर, मैंने एक कमांड टाइप किया और एंटर मारा। यह कुछ भी उत्पादन नहीं करता है। मैं कैसे बताऊं कि यह चल रहा है और अभी तक आउटपुट नहीं है, या यह उपयोगकर्ता इनपुट के लिए पूछ रहा है?


अगर यह इंतजार कर रहा है तो आपको PS1संकेत नहीं मिलेगा ।
Prvt_Yadav

1. कृपया हमें बताएं कि यह कौन सा कार्यक्रम है (यह चुप है), और हम आपको इस बारे में अधिक सटीक सलाह दे सकते हैं कि क्या उम्मीद करें और इसे कैसे जांचें; 2. क्या आप एक चेतावनी प्राप्त करना चाहेंगे, जब कार्यक्रम अंत में इनपुट मांगता है या समाप्त हो गया है (ताकि टर्मिनल विंडो पर कुछ लिखा हो?
sudodus

यदि कोई इनपुट अपेक्षित है, तो मुझे लगता है कि आप इनपुट के लिए पूछते हुए एक संदेश के साथ एक संकेत प्राप्त करेंगे।
रिनविविंड

5
@ रिनविंड - यह एक खराब धारणा है। मन के लिए पहला प्रतिसाद catकमांड है। बस catअपने आप टाइप करें और यह स्टड से इनपुट की प्रतीक्षा करेगा, लेकिन कोई संकेत नहीं देता है। कई अन्य कमांड भी इसी तरह का व्यवहार करते हैं क्योंकि वे या तो स्टड या फाइल से इनपुट की उम्मीद करते हैं, लेकिन विभिन्न इनपुट स्रोतों (इंटरेक्टिव टर्मिनल, पाइप, फ़ाइल ...) के बीच अंतर नहीं करते हैं।
डेव शेरोहमान

जवाबों:


15

कई दृष्टिकोण हैं:

  1. इनपुट के सिग्नलिंग अंत की कोशिश करें : सुपरसुसर विशेषाधिकारों के बिना यह जानना मुश्किल है कि हुड के नीचे क्या चल रहा है। जो किया जा सकता है उसे Ctrl+ दबाना है dकैनोनिकल मोड में टर्मिनल और यूटिलिटीज read()इस कुंजी संयोजन के लिए ईओटी सिग्नल प्राप्त करने पर सभी उपलब्ध पाठ को syscall पर भेजते हैं , और यदि कोई इनपुट नहीं है - read()नकारात्मक निकास स्थिति देता है जिसे अधिकांश उपयोगिताओं को बाहर निकलने के संकेत के रूप में स्वीकार करते हैं। इसलिए, यदि एक उपयोगिता इनपुट की प्रतीक्षा कर रही है, तो यह कुंजी संयोजन प्राप्त करने पर बाहर निकल जाएगी। अन्यथा, उपयोगिता या तो कार्य चल रही है या ठीक से नहीं लिखी गई है।

  2. Syscalls पर जासूसी : यदि आपके पास सुपरसुसर विशेषाधिकार है, तो आप straceदूसरे टर्मिनल में चला सकते हैं यह देखने के लिए कि वर्तमान में क्या किया जा रहा है। इसके लिए आपको कार्यक्रम के पीआईडी ​​का पता लगाना होगा। उदाहरण के लिए, एक अन्य टर्मिनल टैब रन में pgrep -f firefoxजो उदाहरण के रूप में 1234 हो सकता है और फिर sudo strace -f -p 1234। यदि आपके द्वारा देखा गया आउटपुट read()syscall पर अटक गया है , तो इसका मतलब है कि कमांड संभवतः इनपुट की प्रतीक्षा कर रहा है। अन्यथा, यदि आप syscalls को चालू देखते हैं, तो कमांड कुछ और कर रहा है। यदि लंबे समय से चल रही कमांड से बाहर निकल गए हैं, तो यह भी जानने के लिए संबंधित प्रश्न देखें strace

  3. कमांड के स्वयं के तरीकों का उपयोग करें : अन्य चीजों के अलावा, उपयोगिताओं जैसे ddसिग्नल। उदाहरण के लिए, यदि आप उपयोग करते हैं kill -USR1 1234(जहां 1234 रनिंग ddकमांड का पीआईडी ​​है ), यह वर्तमान में संसाधित होने वाले बाइट की मात्रा को रोकने के लिए प्रिंट करेगा। बेशक, इसके लिए पहले स्थान पर कमांड के ऐसे व्यवहार के बारे में जानना आवश्यक है। उपरोक्त दो विधियां अधिक सामान्य हैं, और प्रत्येक कमांड के व्यवहार के गहन ज्ञान की आवश्यकता नहीं है (हालांकि यह हमेशा जानना सबसे अच्छा है कि आप वास्तव में क्या कर रहे हैं - अन्यथा आप एक कमांड चलाने का जोखिम उठाते हैं जो नुकसान पहुंचा सकता है)।


+1। straceविधि के लिए धन्यवाद :-) लेकिन सरल तरीके भी उपयोगी हैं (प्रत्येक प्रोग्राम के लिए सामान्य या विशिष्ट)। उनमें से कुछ सुपरसुसर विशेषाधिकारों के बिना काम करते हैं। उदाहरण: जाँच करें कि ddक्या कुछ कर रहा है और जाँच करें कि grep --color asdfचुपचाप प्रतीक्षा क्यों की जा रही है।
सुडोडुस

@sudodus आह, ddमैं उस एक जोड़ दूँगा के बारे में अच्छा अनुस्मारक ।
सर्गी कोलोडियाज़नी

आपको अपने उपयोगकर्ता के स्वामित्व वाली प्रक्रिया को डीबग करने के लिए सुपरयुसर विशेषाधिकारों की आवश्यकता नहीं है। ठीक है, जब तक कि आपने सिस्टम को उचित रूप से सेट नहीं किया है
रुस्लान

6

कैसे बताएं कि क्या कोई प्रोग्राम चल रहा है या उपयोगकर्ता इनपुट चाहता है

यह कार्यक्रम पर निर्भर करता है और आप इसे कैसे लागू करते हैं।

  • अक्सर लेकिन हमेशा एक संकेत नहीं होगा, यह इंगित करता है कि कार्यक्रम इनपुट के लिए पूछ रहा है।

  • यदि आप निश्चित नहीं हैं, तो आप देख सकते हैं कि कार्यक्रम की प्रक्रिया व्यस्त है या नहीं

    • CPU का उपयोग करता है - का उपयोग करें topयाhtop

    • पढ़ता है या लिखता है - उपयोग sudo iotop -o

  • और जब कार्यक्रम समाप्त हो गया है, तो आप शेल का संकेत देखेंगे।

Shellscript running

मेरे पास एक शेल्स्क्रिप्ट थी जो यह बताती है कि क्या कोई कार्यक्रम चल रहा है, और अब मैंने -sइसे चलाने के लिए विकल्प को जोड़ दिया है sudo strace -f -p <PID>(सर्गिय कोलोडाज़नी के जवाब के अनुसार) जब एक ... पाया जाता है।

गोले का उपयोग करता है

  • ps -ef अधिकांश कार्यक्रमों को खोजने के लिए
  • systemctl is-active --quiet कुछ कार्यक्रमों को खोजने के लिए
  • और अगर आप straceएक xtermखिड़की में चाहते हैं।

    xtermयदि आप straceकिसी प्रोग्राम की गतिविधि देखने के लिए उपयोग करना चाहते हैं तो इंस्टॉल करें ।

प्रयोग

$ ./running
Usage:    ./running <program-name>
          ./running <part of program name>
Examples: ./running firefox
          ./running term                     # part of program name
          ./running dbus
          ./running 'dbus-daemon --session'  # words with quotes
          ./running -v term                  # verbose output
          ./running -s term                  # strace checks activity

यदि आप इसे आसानी से प्राप्त करना चाहते हैं running, PATHतो आप शेल्स्क्रिप्ट को एक निर्देशिका में स्थापित कर सकते हैं ।

शेलस्क्रिप्ट कोड

#!/bin/bash

# date        sign     comment
# 2019-02-14  sudodus  version 1.0

verbose=false
strace=false
if [ "$1" == "-v" ]
then
 verbose=true
 shift
fi
if [ "$1" == "-s" ]
then
 strace=true
 shift
fi

if [ $# -ne 1 ]
then
 echo "Usage:    $0 <program-name>
          $0 <part of program name>
Examples: $0 firefox
          $0 term                     # part of program name
          $0 dbus
          $0 'dbus-daemon --session'  # words with quotes
          $0 -v term                  # verbose output
          $0 -s term                  # strace checks activity"
 exit
fi

inversvid="\0033[7m"
resetvid="\0033[0m"
redback="\0033[1;37;41m"
greenback="\0033[1;37;42m"
blueback="\0033[1;37;44m"

runn=false
#tmpfil=$(mktemp)
tmpdir=$(mktemp -d)
tmpfil="$tmpdir/tmpfil"
vtfile="$tmpdir/vtfile"
vthead="$tmpdir/vthead"

# check by systemctl

systemctl is-active --quiet "$1"
if [ $? -eq 0 ]
then
 echo "systemctl is-active:"
 runn=true
fi

# check by ps

ps -ef | tr -s ' ' ' ' | cut -d ' ' -f 8- | grep "$1" | grep -vE -e "$0 *$1" -e "$0 *.* *$1" -e "grep $1" | sort -u > "$tmpfil"
#cat "$tmpfil"
if $verbose || $strace
then
 ps -ef |head -n1 > "$vthead"
 ps -ef | grep "$1" | grep -vE -e "$0 *.* *$1" -e "grep $1" | sort -u > "$vtfile"
fi

tmpstr=$(head -n1 "$tmpfil")
#echo "tmpstr=$tmpstr"
tmpess=$(grep -om1 "$1" "$tmpfil")
#echo "tmpess=$tmpess"
if [ "$tmpstr" == "$1" ] || [ "${tmpstr##*/}" == "$1" ] || [ "${1##*/}" == "${0##*/}" ] || [ "$tmpess" == "$1" ]
then
 echo "ps -ef: active:"
 runn=true
 if $verbose
 then
  cat "$vthead" "$vtfile"
 fi
elif test -s "$tmpfil"
then
 if $runn
 then
  echo "----- consider also ------------------------------------------------------------"
  if $verbose
  then
   cat "$vthead" "$vtfile"
  else
   cat "$tmpfil"
  fi
  echo "--------------------------------------------------------------------------------"
 else
  echo "----- try with: ----------------------------------------------------------------"
  if $verbose
  then
   cat "$vthead" "$vtfile"
  else
   cat "$tmpfil"
  fi
  echo "--------------------------------------------------------------------------------"
 fi
fi

if $runn
then
 echo -en "$greenback '$1"
 if [ "$tmpstr" != "$tmpess" ]
 then
  echo -n " ..."
 fi
 echo -e "' is running $resetvid"

 if $strace
 then
  which xterm
  if [ $? -eq 0 ]
  then
   pid=$(head -n1 "$vtfile" | sed 's/^ *//' | tr -s ' ' '\t' | cut -f 2)
   echo "checking pid=$pid; quit with 'ctrl + c' in the xterm window"
   xterm -title "'strace' checks '$1'" 2> /dev/null -e sudo strace -f -p $pid
  else
   echo "Please install 'xterm' for this function to work"
   exit
  fi
 fi
else
 inpath=$(which "$1")
 if [ "$inpath" == "" ]
 then
  echo -e "$redback no path found to '$1' $resetvid"
 else
  echo -e "$blueback '$1' is not running $resetvid"
 fi
fi
rm -r "$tmpdir"

डेमो

लुबंटू में टर्मिनल विंडो की जाँच (LXTerminal के रूप में x-terminal-emulatorऔर कस्टम gnome-terminalविंडो शुरू )

$ running -v -s term 
----- try with: ----------------------------------------------------------------
UID        PID  PPID  C STIME TTY          TIME CMD
sudodus   2087  1384  0 13:33 ?        00:00:00 x-terminal-emulator
sudodus   2108  1269  0 13:33 ?        00:00:17 /usr/lib/gnome-terminal/gnome-terminal-server
--------------------------------------------------------------------------------
 no path found to 'term' 

$ running -v -s x-terminal-emulator
ps -ef: active:
UID        PID  PPID  C STIME TTY          TIME CMD
sudodus   2087  1384  0 13:33 ?        00:00:00 x-terminal-emulator
 'x-terminal-emulator' is running 
/usr/bin/xterm
checking pid=2087; quit with 'ctrl + c' in the xterm window

टर्मिनल विंडो में कर्सर के होते ही बहुत सारी गतिविधि होती है ।

यहाँ छवि विवरण दर्ज करें

शुरू करना grep(इनपुट से प्रतीक्षा करना /dev/stdin)

$ grep -i --color 'hello'
asdf
Hello World    
Hello World

इसकी जाँच हो रही है

$ running -s grep
ps -ef: active:
 'grep ...' is running 
/usr/bin/xterm
checking pid=14982; quit with 'ctrl + c' in the xterm window

बहुत अधिक गतिविधि नहीं है, और आप पहचान सकते हैं कि क्या हो रहा है।

यहाँ छवि विवरण दर्ज करें


अच्छा है iotop, हालांकि सीपीयू का उपयोग जरूरी नहीं कि एक प्रक्रिया में व्यस्त होने पर एक संकेतक हो सकता है। C और अनुकूलित में लिखा गया एक प्रोग्राम न्यूनतम CPU का उपयोग कर सकता है। पायथन में लिखे गए कुछ संकेतकों को चलाने के लिए एक दोहराया कार्य शेड्यूल किया गया है, इसलिए यह एक संक्षिप्त क्षण के लिए संकेतक मेनू को अपडेट करने के लिए सीपीयू का उपयोग कर सकता है और फिर बस वहां बैठता है।
सेर्गेई कोलोडियाज़नी

@SergiyKolodyazhnyy, हाँ, आप इसके बारे में सही हैं। straceविधि बेहतर आवश्यक है या नहीं उपलब्ध नहीं है, लेकिन शायद।
सूदोदास

माना। मुझे नहीं लगता कि यह उबंटू के साथ पूर्वस्थापित है, और ओवरकिल हो सकता है।
सेर्गेई कोलोडियाज़नी

1

यकीन नहीं है कि अगर आपको अभी भी इसकी आवश्यकता है, लेकिन फिर भी यह जानने के लिए एक उपयोगी चाल है: यदि प्रोग्राम बिना किसी आउटपुट के बाहर निकलता है तो आप देख सकते हैं कि क्या यह पृष्ठभूमि में चल रहा है

ps -efa | grep "program_name"

चीयर्स!


1

यदि आप किसी टर्मिनल में शेल चला रहे हैं, उदाहरण के लिए एक टर्मिनल एमुलेटर या एक विशिष्ट ssh सत्र, तो आपके शेल में लगभग निश्चित रूप से सक्षम जॉब कंट्रोल है। यह ज्यादातर मामलों में आपके सवाल का जवाब आसान हो जाता है।

टाइप Ctrl+Zप्रक्रिया को निलंबित करने और फिर bgपृष्ठभूमि में यह जारी है, तो खोल करने के लिए एक खाली पंक्ति टाइप करने के लिए तो यह जांच करेंगे कि क्या कार्यक्रम एक संकेत द्वारा बंद कर दिया गया।

यदि प्रक्रिया टर्मिनल से पढ़ने की कोशिश कर रही है, तो यह तुरंत एक SIGTTINसंकेत प्राप्त करेगा और निलंबित हो जाएगा। (जब नौकरी नियंत्रण सक्षम हो जाता है, तो सिस्टम टर्मिनल से पढ़ने के लिए एक बार में केवल एक प्रक्रिया की अनुमति देता है।) शेल इसकी रिपोर्ट करेगा। फिर आप fgअग्रभूमि में प्रक्रिया को जारी रखने के लिए टाइप कर सकते हैं , और फिर प्रोग्राम द्वारा सामान्य रूप से पढ़ने के लिए इनपुट टाइप कर सकते हैं।

mp@ubuntu:~$ sleep 30 # a program that is not reading from the terminal
^Z
[1]+  Stopped                 sleep 30
mp@ubuntu:~$ bg
[1]+ sleep 30 &
mp@ubuntu:~$ 
mp@ubuntu:~$ 


mp@ubuntu:~$ cat - # a program that is reading from the terminal
^Z
[1]+  Stopped                 cat -
mp@ubuntu:~$ bg
[1]+ cat - &
mp@ubuntu:~$ 
[1]+  Stopped                 cat -
mp@ubuntu:~$ jobs -l
[1]+  3503 Stopped (tty input)     cat -
mp@ubuntu:~$ fg
cat -
hi
hi

कुछ कार्यक्रम, जैसे कि संपादक, या तो उत्पन्न जाल को अनदेखा कर देंगे या Ctrl+Zटर्मिनल को एक ऐसी विधा में डाल देंगे, जहाँ नियंत्रण वर्ण भी संकेत उत्पन्न नहीं करते हैं। आप इस तरह के रूप में उपयोग करते हुए इस मामले में और अधिक उन्नत तकनीकों, का उपयोग करना होगा straceदेखने के लिए कि प्रक्रिया कर रही है read, select, poll, आदि

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.