কোনও কমান্ড চলমান বা ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা করছে কিনা আমি কীভাবে বলব?


14

কমান্ড লাইনে, আমি একটি কমান্ড টাইপ করে এন্টার চাপি hit এটি কিছুই আউটপুট দেয় না। এটি চলমান এবং এখনও আউটপুট না থাকলে কীভাবে বলব বা এটি ব্যবহারকারী ইনপুট চেয়েছে?


যদি এটি অপেক্ষা করে থাকে তবে আপনি PS1প্রম্পট পাবেন না ।
প্রাইভেট_ ইয়াদভ

১. অনুগ্রহ করে এটি কোন প্রোগ্রাম (তা নিরব) আমাদের বলুন এবং কী আশা করবেন এবং কীভাবে এটি পরীক্ষা করবেন সে সম্পর্কে আমরা আপনাকে আরও সুনির্দিষ্ট পরামর্শ দিতে পারি; ২. আপনি কি একটি সতর্কতা পেতে চান, যখন প্রোগ্রামটি শেষ পর্যন্ত ইনপুট চাইতে বা শেষ করে (যাতে টার্মিনাল উইন্ডোতে কিছু লেখা থাকে?
সুডোডাস

যদি কোনও ইনপুট প্রত্যাশিত থাকে তবে আমি ধরে নেব আপনি এর সামনে একটি বার্তা সহ একটি ইনপুট চেয়ে জিজ্ঞাসা করবেন।
রিনজুইন্ড

5
@ রিনজুইন্ড - এটি একটি দরিদ্র ধারণা নয়। মনের প্রথম কাউন্টারেক্সেক্সামাল হ'ল catকমান্ড। কেবল catনিজেই টাইপ করুন এবং এটি স্টিডিনের ইনপুটটির জন্য অপেক্ষা করবে, তবে কোনও প্রম্পট দেয় না। অন্যান্য অনেক কমান্ড একইরকম আচরণ করে কারণ তারা স্টিডিন বা কোনও ফাইল থেকে ইনপুট প্রত্যাশা করে তবে বিভিন্ন ইনপুট উত্সগুলির মধ্যে পার্থক্য না করে (ইন্টারেক্টিভ টার্মিনাল, পাইপ, ফাইল ...)।
ডেভ শেরোহমান

উত্তর:


15

বেশ কয়েকটি পদ্ধতি রয়েছে:

  1. ইনপুটটির শেষের ইঙ্গিত দেওয়ার চেষ্টা করুন : অতিপরিচ্ছন্ন সুযোগ সুবিধা ছাড়াই হুডের নীচে কী চলছে তা জানা শক্ত। কি করা যায় তা Ctrl+ টিপুন dক্যানোনিকাল মোডে টার্মিনাল এবং ইউটিলিটিগুলি read()এই কী সংমিশ্রনের সাথে আবদ্ধ ইওটি সংকেত প্রাপ্তির পরে সমস্ত উপলব্ধ পাঠ্য সিস্কেলে প্রেরণ করে এবং যদি কোনও ইনপুট না থাকে - read()নেতিবাচক প্রস্থান স্থিতি দেয় যা বেশিরভাগ ইউটিলিটিগুলি প্রস্থান করার জন্য সংকেত হিসাবে গ্রহণ করে। সুতরাং, যদি কোনও ইউটিলিটি ইনপুটটির জন্য অপেক্ষা করে থাকে তবে এটি মূল সংমিশ্রণটি পাওয়ার পরে প্রস্থান করবে exit অন্যথায়, ইউটিলিটি হয় হয় চলমান কাজগুলি বা সঠিকভাবে লেখা হয় না।

  2. সিস্কলগুলিতে গুপ্তচরবৃত্তি : যদি আপনার কাছে সুপারসউর সুবিধা থাকে তবে আপনি straceবর্তমানে কী চলছে তা দেখতে আপনি অন্য একটি টার্মিনালে চালাতে পারেন । তার জন্য আপনাকে প্রোগ্রামটির পিআইডি খুঁজে বের করতে হবে। উদাহরণস্বরূপ, অন্য একটি টার্মিনাল ট্যাবে চালানো pgrep -f firefoxযা 1234 উদাহরণ হিসাবে এবং তারপরে হতে পারে sudo strace -f -p 1234। আপনি যে আউটপুটটি দেখছেন তা যদি read()সিস্কলে আটকে থাকে তবে এর অর্থ হ'ল কমান্ডটি সম্ভবত ইনপুটটির জন্য অপেক্ষা করছে। অন্যথায়, আপনি যদি সিস্কলগুলি চালিয়ে দেখেন, তবে কমান্ড অন্য কিছু করছে। দীর্ঘমেয়াদী কমান্ডটি বন্ধ হয়ে গেছে কিনা তা নির্ধারণের জন্য ব্যবহার সম্পর্কিত সম্পর্কিত প্রশ্নটি দেখুন strace

  3. কমান্ডের নিজস্ব পদ্ধতিগুলি ব্যবহার করুন : অন্যান্য জিনিসের মধ্যে ddব্যবহারের সংকেতগুলির মতো ইউটিলিটি । উদাহরণস্বরূপ, আপনি যদি ব্যবহার করেন kill -USR1 1234(যেখানে 1234 চলমান ddকমান্ডের পিআইডি ), এটি বর্তমানে প্রক্রিয়াকৃত বাইটের পরিমাণকে ছাপিয়ে মুদ্রণ করবে। অবশ্যই, কমান্ডের এইরকম আচরণ সম্পর্কে প্রথমে জানা দরকার। উপরের দুটি পদ্ধতি আরও সাধারণ, এবং প্রতিটি কমান্ডের আচরণ সম্পর্কে গভীর জ্ঞানের প্রয়োজন নেই (যদিও আপনি আসলে কী সম্পাদন করছেন তা জানা সর্বদা সেরা - অন্যথায় আপনি কোনও কমান্ড ক্ষতিগ্রস্থ করতে পারেন যা চালানোর ঝুঁকি রয়েছে)।


+1 টি। straceপদ্ধতির জন্য ধন্যবাদ :-) তবে সহজ পদ্ধতিগুলিও কার্যকর (প্রতিটি প্রোগ্রামের জন্য সাধারণ বা নির্দিষ্ট)। তাদের মধ্যে কিছু সুপারওর প্রাইভেটস ব্যতিরেকে কাজ করে। উদাহরণস্বরূপ: ddকিছু করছে কিনা তা পরীক্ষা করে দেখুন এবং কেন grep --color asdfনীরবে অপেক্ষা করছেন check
সুডোডাস

@ সুদোদাস আহ, ddআমি এটি যুক্ত করব সম্পর্কে ভাল অনুস্মারক ।
সের্গেই কোলোডিয়াজনি

আপনার ব্যবহারকারীর মালিকানাধীন কোনও প্রক্রিয়া ডিবাগ করার জন্য আপনার সুপারভাইজার সুবিধার দরকার নেই। ভাল, যদি না আপনি সিস্টেমটি সঠিকভাবে সেট আপ না করে থাকেন ।
রুসলান

6

কোনও প্রোগ্রাম চলছে কিনা বা ব্যবহারকারী ইনপুট চাইছে কীভাবে তা বলবেন

এটি প্রোগ্রাম এবং আপনি কীভাবে আহ্বান করবেন তার উপর নির্ভর করে।

  • প্রায়শই তবে সর্বদা একটি প্রম্পট থাকে না, এটি নির্দেশ করে যে প্রোগ্রামটি ইনপুট চেয়েছে।

  • আপনি যদি নিশ্চিত না হন তবে আপনি প্রোগ্রামটির প্রক্রিয়াটি ব্যস্ত কিনা তা পরীক্ষা করে দেখতে পারেন

    • সিপিইউ - ব্যবহার topবা ব্যবহার করেhtop

    • পড়া বা লেখার - ব্যবহার sudo iotop -o

  • এবং প্রোগ্রামটি শেষ হয়ে গেলে, আপনি শেলের প্রম্পটটি দেখতে পাবেন।

হোস্টনেম 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"

ডেমো

লুবুন্টুতে টার্মিনাল উইন্ডোগুলি পরীক্ষা করা হচ্ছে (এলএক্সটার্মিনালটি 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, যদিও কোনও প্রক্রিয়া ব্যস্ত থাকলে সিপিইউর ব্যবহারের প্রয়োজনীয়তা অবশ্যই সূচক হতে পারে না। সি তে লিখিত এবং অনুকূলিত একটি প্রোগ্রাম ন্যূনতম সিপিইউ ব্যবহার করতে পারে। পাইথনে আমি যে কয়েকটি সূচক লিখেছি সেগুলি চালনার জন্য একটি পুনরাবৃত্ত টাস্ক শিডিউল করে, তাই এটি সংক্ষিপ্ত মুহুর্তের জন্য সূচক মেনু আপডেট করতে সিপিইউ ব্যবহার করতে পারে এবং কেবল সেখানে বসে থাকে।
সের্গেই কোলোডিয়াজনি

@ সের্গি কলডিয়াজনি, হ্যাঁ, আপনি এ সম্পর্কে ঠিক বলেছেন। straceপদ্ধতি ভাল প্রয়োজনীয় বা না পাওয়া যায় না, কিন্তু হয়তো।
সুডোডাস

একমত। আমি মনে করি না এটি উবুন্টুর সাথে পূর্বনির্ধারিত আসে, এবং সম্ভবত ওভারকিল হতে পারে।
সের্গেই কোলোডিয়াজনি

1

আপনার এখনও এটির প্রয়োজন আছে কিনা তা নিশ্চিত নন, তবে এটি একটি কার্যকর কৌশল: যদি প্রোগ্রামটি কোনও আউটপুট ছাড়াই প্রস্থান করে বলে মনে হয় আপনি এটি নির্বাহের মাধ্যমে পটভূমিতে চলছে কিনা তা পরীক্ষা করতে পারেন

ps -efa | grep "program_name"

চিয়ার্স!


1

আপনি যদি কোনও টার্মিনালে শেলটি চালাচ্ছেন, উদাহরণস্বরূপ টার্মিনাল এমুলেটর বা একটি সাধারণ এসএস সেশন, আপনার শেলটি অবশ্যই অবশ্যই জব নিয়ন্ত্রণ সক্ষম করেছে। এটি বেশিরভাগ ক্ষেত্রে আপনার প্রশ্নের উত্তর পাওয়া খুব সহজ করে তোলে।

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, ইত্যাদি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.