linux - কিভাবে ইতিমধ্যে চলমান প্রক্রিয়া আউটপুট পুনঃনির্দেশিত
bash (4)
Dupx
Dupx একটি সহজ * nix ইউটিলিটি স্ট্যান্ডার্ড আউটপুট / ইনপুট / ইতিমধ্যে চলমান প্রক্রিয়া ত্রুটি পুনঃনির্দেশ করার জন্য।
প্রেরণা
আমি প্রায়শই এমন অবস্থায় নিজেকে খুঁজে পেয়েছি যেখানে SSH এর মাধ্যমে একটি রিমোট সিস্টেমে আমি যে প্রক্রিয়াটি শুরু করেছি, তার চেয়ে অনেক বেশি সময় লাগে। আমার এসএসএইচ সংযোগটি ভাঙতে হবে, কিন্তু যদি আমি তা করি তবে স্ট্রাউট / ভাঙা পাইপের ত্রুটিতে কিছু লিখতে গেলে এটি প্রক্রিয়া মরাবে। আমি জেড এবং তারপর কি একটি সঙ্গে প্রক্রিয়া স্থগিত করতে পারে
bg %1 >/tmp/stdout 2>/tmp/stderr
দুর্ভাগ্যক্রমে এই কাজ করবে না (শেল আমি জানি)।
এই প্রশ্নটি ইতিমধ্যে একটি উত্তর আছে:
সাধারণত আমি মত একটি কমান্ড শুরু হবে
longcommand &;
আমি জানি আপনি ভালো কিছু করে এটি পুনঃনির্দেশিত করতে পারেন
longcommand > /dev/null;
উদাহরণস্বরূপ আউটপুট বা পরিত্রাণ পেতে
longcommand 2>&1 > output.log
আউটপুট ক্যাপচার।
কিন্তু আমি কখনও কখনও ভুলে যাই, এবং আসলে পরে ক্যাপচার বা পুনঃনির্দেশ করার একটি উপায় আছে যদি বিস্মিত ছিল।
longcommand
ctrl-z
bg 2>&1 > /dev/null
অথবা এরকম কিছু যাতে আমি টার্মিনাল ব্যবহার করে টার্মিনাল ব্যবহার করে চালিয়ে যেতে পারি।
আপনি rereadirect ( https://github.com/jerome-pouiller/reredirect/ ) ব্যবহার করেও এটি করতে পারেন।
আদর্শ
reredirect -m FILE PID
এবং আউটপুট (মান এবং ত্রুটি) ফাইলে লেখা হবে।
REREMETER README এছাড়াও কীভাবে প্রক্রিয়াটির আসল অবস্থা পুনরুদ্ধার করতে পারে, কিভাবে অন্য কমান্ডে পুনঃনির্দেশিত করতে হয় বা শুধুমাত্র স্টডাউট বা স্টেডারকে পুনঃনির্দেশিত করতে পারে।
(পুনঃনির্দেশিত ডুপক্সের আরেকটি উত্তর বর্ণিত তুলনায় একই বৈশিষ্ট্য বলে মনে হচ্ছে তবে এটি Gdb- এ নির্ভর করে না)।
একটি চলমান প্রক্রিয়া থেকে পুনঃনির্দেশ আউটপুট দেখুন।
প্রথমত আমি এক
cat > foo1
কমান্ড চালান এবংcat > foo1
তথ্য ফাইলটিতে অনুলিপি করা হয় তা পরীক্ষা করে দেখুন। তারপর অন্য অধিবেশন আমি আউটপুট পুনঃনির্দেশিত।প্রথমে প্রক্রিয়াটির PID খুঁজে বের করুন:
$ ps aux | grep cat rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat
এখন খোলা ফাইল হ্যান্ডলগুলি চেক করুন:
$ ls -l /proc/6760/fd total 3 lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1 lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5
এখন জিডিবি চালান:
$ gdb -p 6760 /bin/cat GNU gdb 6.4.90-debian [license stuff snipped] Attaching to program: /bin/cat, process 6760 [snip other stuff that's not interesting now] (gdb) p close(1) $1 = 0 (gdb) p creat("/tmp/foo3", 0600) $2 = 1 (gdb) q The program is running. Quit anyway (and detach it)? (y or n) y Detaching from program: /bin/cat, process 6760
GDB এ
p
কমান্ডটি একটি অভিব্যক্তিটির মান মুদ্রণ করবে, একটি অভিব্যক্তি কল করার জন্য একটি ফাংশন হতে পারে, এটি একটি সিস্টেম কল হতে পারে ... তাই আমি একটিclose()
সিস্টেম কল এবং পাস হ্যান্ডেল 1 চালান, তারপর আমি একটিcreat()
একটি নতুন ফাইল খুলতে সিস্টেম কল।creat()
ফলাফলcreat()
1 ছিল যার মানে এটি পূর্ববর্তী ফাইল হ্যান্ডেলটি প্রতিস্থাপিত করেছিল। যদি আমি stdout এবং stderr এর জন্য একই ফাইলটি ব্যবহার করতে চাই অথবা যদি আমি কোনও ফাইল হ্যান্ডেলটি অন্য কোনও নম্বর দিয়ে প্রতিস্থাপন করতে চাই তবে ফলাফলটি অর্জন করতে আমাকেdup2()
সিস্টেম কল কল করতে হবে।এই উদাহরণের জন্য আমি
open()
পরিবর্তেcreat()
ব্যবহার করতে বেছে নিলাম কারণ কম পরিমাপ আছে। পতাকাগুলির জন্য সি ম্যাক্রোগুলি জিডিবি থেকে ব্যবহারযোগ্য নয় (এটি সি শিরোনামগুলি ব্যবহার করে না) তাই আমাকে এটি আবিষ্কার করতে হেডার ফাইলগুলি পড়তে হবে - এটি করা কঠিন নয় তবে আরো সময় লাগবে। উল্লেখ্য, 0600 মালিকের পড়ার / লেখার অ্যাক্সেস এবং গোষ্ঠী এবং অন্যদের অ্যাক্সেস না থাকার অকটাল অনুমতি। এটি সেই পরামিতিটির জন্য 0 ব্যবহার করতে এবং পরে ফাইলটিতে chmod চালানোর জন্য কাজ করবে।তারপরে আমি ফলাফল যাচাই করি:
ls -l /proc/6760/fd/ total 3 lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <==== lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5
cat
মধ্যে আরও তথ্য টাইপ করা ফাইল/tmp/foo3
এ যোগ করা হচ্ছে।আপনি যদি মূল সেশনটি বন্ধ করতে চান তবে এটির জন্য সমস্ত ফাইল হ্যান্ডলগুলি বন্ধ করতে হবে, একটি নতুন ডিভাইস খুলুন যা নিয়ন্ত্রণকারী tty হতে পারে এবং তারপরে
setsid()
কল করুন।
স্ক্রিন
যদি কোনও স্ক্রীন সেশনে প্রক্রিয়া চলছে তবে আপনি সেই উইন্ডোটির আউটপুটটিকে একটি ফাইলটিতে লগ ইন করতে স্ক্রীনের লগ কমান্ডটি ব্যবহার করতে পারেন:
স্ক্রিপ্ট এর উইন্ডোতে স্যুইচ করুন, Ca H লগ ইন করুন।
এখন তুমি পার :
$ tail -f screenlog.2 | grep whatever
স্ক্রিনের ম্যান পৃষ্ঠা থেকে:
লগ [চালু | বন্ধ]
উইন্ডোটির ডিফল্ট ডিরেক্টরিতে "screenlog.n" ফাইলটিতে বর্তমান উইন্ডোটির আউটপুট লেখার শুরু / বন্ধ করুন, যেখানে n বর্তমান উইন্ডোটির সংখ্যা। এই ফাইল নামটি 'logfile' কমান্ড দিয়ে পরিবর্তন করা যেতে পারে। কোন পরামিতি দেওয়া হয় না, লগিং অবস্থা টগল করা হয়। সেশন লগটি যদি ইতিমধ্যে বিদ্যমান থাকে তবে ফাইলের আগের সামগ্রীর সাথে যুক্ত করা হয়। বর্তমান সামগ্রী এবং স্ক্রলব্যাক ইতিহাসের সামগ্রীগুলি সেশন লগ অন্তর্ভুক্ত করা হয় না। ডিফল্ট 'বন্ধ' হয়।
আমি নিশ্চিত tmux কিছু অনুরূপ আছে।