অন্য বাশ সেশনে একটি চলমান প্রক্রিয়াটির আউটপুট কীভাবে দেখবেন?


199

আমি যখন স্থানীয়ভাবে এটিতে কাজ করছিলাম তখন থেকে আমি একটি স্ক্রিনটি একটি রিমোট মেশিনে চালিত রেখেছি। আমি একই ব্যবহারকারী হিসাবে মেশিনে এসএসএইচ সংযোগ করতে এবং স্ক্রিপ্টটি চলমান দেখতে পাচ্ছি ps

$ ps aux | grep ipcheck
myuser  18386  0.0  0.0  18460  3476 pts/0    S+   Dec14   1:11 /bin/bash ./ipchecker.sh

এটি কেবল স্থানীয় সেশনে স্টডআউট করার জন্য আউটপুট করা হয় (আমি ./ipchecker.shএকটি স্থানীয় টার্মিনাল উইন্ডো তৈরি করেছিলাম , কোনও পুনর্নির্দেশ নয়, screenইত্যাদি ব্যবহার নয় )।

কোনও এসএসএইচ অধিবেশন থেকে কি আমি এই চলমান কমান্ডের আউটপুট দেখতে পারি (এটি বন্ধ না করে)?

আমি এখনও অবধি সবচেয়ে ভাল খুঁজে পেয়েছি ব্যবহার করা হয় strace -p 18386কিন্তু আমি পর্দার উপর উড়ে টেক্সট এর hordes পেতে, এটি খুব বিস্তারিত। আমি থামাতে পারি straceএবং তারপরে আউটপুটটি পর্যালোচনা করতে পারি এবং পাঠ্যটি স্ট্যান্ডআউটে মুদ্রিত করে আনতে পারি তবে এটি খুব দীর্ঘ এবং বিভ্রান্ত হয় এবং স্পষ্টতই যখন এটি বন্ধ হয়ে যায় তবে আমি কিছু মিস করতে পারি। আমি স্ক্রিপ্ট আউটপুট লাইভ দেখার উপায় খুঁজে পেতে চাই যেন আমি স্থানীয়ভাবে কাজ করছি।

কেউ কি এই উন্নতি করতে পারেন? স্পষ্ট উত্তরটি হ'ল স্ক্রিপ্টটি পুনঃনির্দেশের সাথে বা একটি screenসেশন ইত্যাদিতে পুনরায় চালু করা, এটি কোনও মিশন সমালোচনামূলক স্ক্রিপ্ট নয় তাই আমি এটি করতে পারি। বরং, আমি এটি একটি মজাদার শেখার অনুশীলন হিসাবে দেখছি।


আপনার প্রক্রিয়াটি ভার্চুয়াল কনসোল বা পরিবেশের মতো কোনও জিইউআই / এক্সটার্মে চলছে?
জিপ্পি


@ জিপ্পি মেশিনটি একটি সম্পূর্ণ জিইউআই (লিনাক্স মেন্ট ১৩, এক্সএফসিই ডেস্কটপ) চালাচ্ছে, আমি একটি জিনোম-টার্মিনাল আপ করেছি।
jwbensley

3
এই সাইটে কমপক্ষে এক ডজন অনুরূপ প্রশ্ন রয়েছে। এর মধ্যে কয়েকটি (এবং একটি উত্তর) খুঁজে পেতে এখানে reptyr সন্ধান করুন।
স্টাফেন চেজেলাস

উত্তর:


180

আপনি যা করতে চান তা যদি বিদ্যমান প্রক্রিয়াটি গুপ্তচর হয় তবে আপনি strace -p1234 -s9999 -e write1234 প্রক্রিয়া আইডিটি ব্যবহার করতে পারেন । ( -s9999স্ট্রিংগুলি 32 টি অক্ষরে ছাঁটাইয়া এড়ানো এবং writeসিস্টেম কল যা আউটপুট তৈরি করে তা এড়িয়ে চলে ।) আপনি যদি কোনও নির্দিষ্ট ফাইল বিবরণীতে strace -p1234 -e trace= -e write=3কেবলমাত্র ডেটা দেখতে চান তবে আপনি কেবল ফাইল বর্ণনাকারী 3-তে লিখিত ডেটা দেখার মতো কিছু ব্যবহার করতে পারেন ( -e trace=সিস্টেমকে বাধা দেয়) লোজড হওয়া থেকে কলগুলি)। এটি আপনাকে ইতিমধ্যে উত্পাদিত আউটপুট দেয় না।

যদি আউটপুটটি খুব দ্রুত স্ক্রল হয় তবে আপনি এটি পেজারে পাইপ করতে পারেন less, বা এটির সাথে কোনও ফাইলে প্রেরণ করতে পারেন strace -o trace.log …

অনেক প্রোগ্রামের সাহায্যে আপনি আপনার বর্তমান টার্মিনালে বা একটি নতুন স্ক্রিন সেশনে পিট্রেস হ্যাক দিয়ে পরবর্তী আউটপুটটি ডাইভার্ট করতে পারেন। দেখুন আমি কীভাবে চলমান প্রক্রিয়াটিকে অস্বীকার করব এবং এটিকে একটি নতুন স্ক্রিন শেলের সাথে যুক্ত করতে পারি? এবং অন্যান্য লিঙ্কযুক্ত থ্রেড।

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


18
আমি মনে করি না আউটপুটটিকে কেবলমাত্র স্ট্যান্ডার্ড আউটপুটে সংকুচিত করার কোনও উপায় আছে ?
জোনা

3
আপনি কি সব যুক্তি ব্যাখ্যা করতে পারেন?
ব্যবহারকারীর

6
নোডেজ থেকে যে আউটপুট পাচ্ছিলাম তাতে প্রচুর ব্যাকস্ল্যাশ এবং সংখ্যা ছিল; তারা কোন এনকোডিংয়ে থাকতে পারে তাতে কোনও সীসা? প্রচুর প্লেইন টেক্সটও ছিল, যা আমার প্রয়োজন ছিল।
থোরস্মমনার

3
"আপনি কি সমস্ত যুক্তি ব্যাখ্যা করতে পারেন?" @ ব্যবহারকারী:man strace
পিস্তোস

3
@ রাফায়েলমনি আপনি যা জিজ্ঞাসা করছেন তা করার একটি প্রোগ্রামকে ডিবাগার বলে।
গিলস

139

আপনি procফাইল সিস্টেমের মাধ্যমে আউটপুট অ্যাক্সেস করতে পারেন ।

tail -f /proc/<pid>/fd/1

1= stdout, 2= stderr


7
এটি আমাকে দেয়: 'পড়ার জন্য / কিনে / <আমার পিড> / এফডি / 1 খুলতে পারে না: এ জাতীয় কোনও ডিভাইস বা ঠিকানা নেই'।
ইয়ারোস্লাভ নিকিতেনকো

18
হ্যাঁ <আমার
পিড

29
যদি আউটপুট টিটিটি (বা পুনঃনির্দেশিত /dev/null) দিকে যায় তবে এটি কাজ করবে না - এটি কেবল তখনই কাজ করবে যদি আউটপুট কোনও ফাইলে পুনঃনির্দেশিত হয়।
ম্যাটডটিএম

1
উবুন্টু 16.04 এ পরীক্ষিত এবং এটি কার্যকর হয় না। একটি সেশনে আমি করি: ping google.esএবং অন্যটিতে মূল হিসাবে: tail -f /proc/`pgrep ping`/fd/2এবং কিছুই দেখানো হয় না।
ডেভিড.প্রেজ

1
তুমি ঠিক. কারণ fd 1 এবং 2 হ'ল / dev / pts ডিভাইসের প্রতীক। আপনি পিটিএস ডিভাইসটি টেইল করতে পারবেন না। আপনার পিং কমান্ডটি ক্রোনজব হিসাবে শিডিউল করুন এবং তারপরে একই করুন। লেজ -f এর পরে কাজ করবে
11

9

বিএসডি-তে আপনি watchকোনও প্রদত্ত tty কে স্নুপ করে ব্যবহার করতে পারেন , যেমন

watch /dev/pts/0

লিনাক্স, এটা যদি সম্ভব প্রক্রিয়া যেমন আগে মাল্টিপ্লেক্সার অধীনে চালানো হয় নি হবে না screenবা tmux। আরও দেখুন: প্রতিবেদক: একটি নতুন টার্মিনালে একটি চলমান প্রক্রিয়া সংযুক্ত করুন

এটা তোলে (যেমন মনে হয় একমাত্র উপায় প্রক্রিয়া ডিবাগ হয় strace, dtrace/ dtruss, gdb, lldb, ইত্যাদি)।

যেহেতু আপনি straceকোনও অর্থবহ আউটপুট আনার জন্য ব্যবহার করেছেন , আপনাকে কোনও যোগ্যতা প্রকাশ (যেমন file) এর মাধ্যমে ফিল্টার করতে হবে , তারপরে আউটপুট পার্স করুন। এখানে উদাহরণ:

strace -e trace=write -s1000 -fp 18386 2>&1 | grep -o '".\+[^"]"'

এটি কীভাবে পিআইডি দ্বারা নির্দিষ্ট প্রক্রিয়া (1000 দৈর্ঘ্য) রচনা অপারেশন মুদ্রণ করে ( pgrepনাম অনুসারে এটি সন্ধান করতে ব্যবহার করে), আউটপুটে স্ট্যান্ডার্ড ত্রুটি পুনর্নির্দেশ করে (ফিল্টার করতে) এবং ডাবল-কোটেড স্ট্রিং প্রিন্ট করে।

আপনি যদি বাইনারি আউটপুট নিয়ে কাজ করে থাকেন তবে আপনি read(সহ -r) এবং printf (সহ %b) উদাহরণস্বরূপ, পালিয়ে যাওয়ার ক্রম অক্ষরগুলি পার্স করতে পারেন

while read -r -t1 line; do printf "%b" $line; done

help readআরও প্যারামিটার পরীক্ষা করুন (উদাহরণস্বরূপ -n, নিউলাইন না করে নির্দিষ্ট পরিমাণে অক্ষরের পরে মুদ্রণ করা))

এখানে আরও সম্পূর্ণ উদাহরণ:

strace -e trace=write -s1000 -fp 18386 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
  printf "%b" $line;
done

কোনও প্রক্রিয়া ব্যবহার করে উদাহরণের জন্য, দয়া করে চেক করুন: কীভাবে প্লেইন পাঠ্যে শেল থেকে স্ট্রেস পার্স করবেন? স্ট্যাকওভারফ্লোতে


4
  1. আপনার রিমোট সার্ভার লগইন শংসাপত্রগুলি এবং আপনার জিইউআইয়ের প্রদর্শন নম্বর দিয়ে ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scaleকোথায় localhostপ্রতিস্থাপন করা হবে তা ব্যবহার করে আপনি দূরবর্তী স্ক্রিনে উঁকি দিতে সক্ষম হতে পারেন :0.0

  2. ব্যবহার করুন x11vnc, যা আপনার স্ক্রিনের এক্স-সেশনের জন্য একটি ভিএনসি সার্ভার।

  3. 6 টির মধ্যে কোনও ভার্চুয়াল কনসোল চালানোর চেষ্টা করুন sudo setterm -dump 2 -file /dev/stdout, যেখানে আপনি 2যথাযথ উপাচারীর সাথে প্রতিস্থাপন করুন ।


4

আমি একটি নামযুক্ত পাইপ তৈরি করার পরামর্শ দেব ( mkfifo) এবং তারপরে সেই ফাইলটিতে লিখুন। তারপরে, এটি থেকে পড়ুন। আপনি সর্বদা tailআউটপুট হ্রাস করার মতো জিনিসগুলির সাহায্যে এটি করতে পারেন ইত্যাদি যখনই আপনি পাইপ সাফ করেন (এটি থেকে পড়ুন), এটি সাফ হয়ে যায়, ফলে আউটপুট সংরক্ষণ করা যায় না।

অন্য বিকল্পটি হ'ল কোনও ফাইলকে সমস্ত কিছু লিখতে হবে (অনেকটা লগফাইলের মতো) এবং তারপরে যেকোন সময় এটি বিশ্লেষণ করতে হবে। আপনি যদি সমস্ত আউটপুট সংরক্ষণ করতে চান তবে এটি পছন্দসই কর্ম হবে।


3

আপনি সর্বদা নোহোপ এবং এমন একটি প্রক্রিয়া চালু করতে পারেন &

nohup rsync source_file dest_file &

তারপরে, আপনি যে কোনও টিটি দিয়ে এর সাথে অগ্রগতি পরীক্ষা করতে পারবেন:

tail -f nohup.out

এটি আমার পক্ষে কাজ করে।


6
এই প্রশ্নটি সম্পর্কে আমি কীভাবে সতর্কতা চলমান প্রক্রিয়াটির আউটপুট দেখতে হবে তা নয়, আপনার উত্তর হিসাবে পটভূমিতে কোনও প্রক্রিয়াটি কীভাবে চালানো যায়
jwbensley

আসলে, আপনার: nohup উল্লেখ আমাকে আলোকিত! ধন্যবাদ!
নম জি ভি ইউ

1

আউটপুট পেতে খুব সহজ একটি ফাইল আপনার আউটপুট ক্যাপচার এবং সেই ফাইলটি টেলিং করবে।

যদি কর: ./ipcheck

ইনস্টল করুন: ./ipcheck> [প্রতিস্থাপনের_পরে]

এটি আপনার স্ক্রিপ্টটি অবস্থিত যেখানে একটি আউটপুট ফাইল তৈরি করবে। তারপরে অন্য কোনও ব্যাশ শেল থেকে আপনি কেবল ফাইলটি টেল করতে পারেন:

লেজ [প্রতিস্থাপনের সাথে সম্পর্কিত ফাইল] -ফ


ফাইল পুনর্নির্দেশটি ডিফল্টরূপে ব্লক-ভিত্তিক বাফারিং ব্যবহার করে (দেখুন setbuf(3)) যা tailসমস্যাজনিত হতে পারে ।
ট্রিগার করুন

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

1

স্ট্রেসের আউটপুট পার্সিং করা হচ্ছে:

আমি উপরের উত্তরটি ব্যবহার করেছি (আমার প্রসেস আইডি সহ 28223) ...

> sudo strace -p28223 -s9999 -e write
...
write(9, "Info\nI\nCare\nabout", 55) = 55
...

আমি যত্নশীল তা নির্ধারণ করতে write(9। (9 টি নীচে ব্যবহার করা হয়েছে, এটি সম্ভবত কোনও ফাইল হ্যান্ডেল এবং আপনার প্রক্রিয়াটির জন্য পৃথক হতে পারে)) তারপরে পার্স এবং প্রদর্শন করার জন্য আমি একটি দ্রুত রুবি স্ক্রিপ্ট লিখেছিলাম।

নিম্নলিখিতটি আটকান /usr/bin/parse_strace.rb

#!/usr/bin/ruby

num = ARGV[0]
STDIN.each { |line|
  if (line.match(/write\(#{ num },\s*"(.*?)"/)) then
    puts $1.split('\x').map { |s| s.to_i(16).chr }.join()
  end
}

ভুলে যাবেন না chmod a+x /usr/bin/parse_strace.rb

আমি প্রথম আর্গ হিসাবে strace -xxআমার স্ক্রিপ্টে পাইপিং (এসটিডিআরআর সমেত) পাইপিং (হেক্স আউটপুট হেক্সস, তাই রেজেক্স সঠিকভাবে মেলে) প্রার্থনা করছি 9

sudo sh -c 'strace -xx -p28223 -s9999 -e write 2>&1 | parse_strace.rb 9'

এবং, ভয়েলা, এটি প্রক্রিয়াটির মূল STDOUT, নিউলাইনগুলি, রঙ এবং সমস্তকে আউটপুট করে!

STDOUT প্রক্রিয়া সংযুক্ত করা হচ্ছে


0

আপনি প্রক্রিয়া আইডি পেতে এবং ইউএসআর 1 এর সাথে যোগাযোগ করতে পারবেন না,

$pgrep -l '^ipchecker.sh$'

যা আপনার স্ক্রিপ্টের পিআইডি প্রিন্ট করে, তারপর এটি ব্যবহার করুন

$ kill -USR1 PID

আমি বুঝতে পারি যে ইউএসআর 1 একটি "ব্যবহারকারী সংজ্ঞায়িত" সিগন্যাল, যার অর্থ প্রোগ্রামটি তৈরি করা কেউই এটি "শাট ডাউন" বা "আপনার লগগুলি ডাম্প" বা "প্রিন্ট ফু এক হাজার বার" বা যা কিছু বোঝাতে ব্যবহার করতে পারে।

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