ইতিমধ্যে চলমান স্ক্রিপ্ট থেকে স্ট্যাডার পুনঃনির্দেশ করুন


14

আমি বেশ কয়েকদিন ধরে স্ক্রিপ্ট চালাচ্ছি। আমি stdout এ পুনঃনির্দেশ করেছি $HOME/mylog, তবে স্টাডারকে পুনর্নির্দেশ করিনি কারণ আমি ভেবেছিলাম এতে কিছুই থাকবে না। হঠাৎ স্টাডারের উপর হাজার হাজার লাইন আসতে শুরু করে, তাই আমি এই কাজটি স্থগিত করে দিয়েছি। $HOME/myerrস্ক্রিপ্টটি পুনরায় আরম্ভ করার প্রয়োজন ছাড়াই এখন থেকে স্ট্যান্ডারকে এখন থেকে পুনর্নির্দেশের কোনও উপায় আছে কি ?

আমার বাক্সে সুডো অ্যাক্সেস রয়েছে এবং এটি ওএস এক্স।

সম্ভবত কিছু ডলটুল ফাঁদে ব্যবহার করছে?

আমি এখন পর্যন্ত স্ক্রিপ্টের কাজটি হারাতে পারি না এবং এটিকে স্ক্র্যাচ থেকে পুনরায় চালু করতে পারি। ডিস্কে "ইন-মেমরি অবজেক্টগুলি ডাম্প" করা, প্রোগ্রামকে হিমশীতল করা, ভেরিয়েবলগুলি (যেমন ফাইল বর্ণনাকারী) সম্পাদনা করার এবং নতুন প্রসঙ্গে পুনরায় শুরু করার কোনও উপায় আছে কি?


উত্তর:


12

আমি মনে করি যদি আপনি সংশ্লিষ্ট দোভাষীটির প্রক্রিয়াটি জিডিবির সাথে সংযুক্ত করেন তবে এটি সম্ভব। আমি এই পার্ল ওয়ান-লাইনার দিয়ে চেষ্টা করেছি

 perl -e 'do { print "x\n"; sleep(1) } while(1)'

এবং এটি কাজ করে তবে দুর্ভাগ্যক্রমে কোনও অনুরূপ বাশ স্ক্রিপ্টের সাথে নয়।


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

attach PID
call close(2)
call open("/abs/olu/te/path/filename", 65, 384)
detach PID

তার পরে লেখা সমস্ত তথ্য যেহেতু stderrপুনঃনির্দেশিত হয়/abs/olu/te/path/filename

  • attach PID প্রক্রিয়াটি জিডিবিতে সংযুক্ত করে এবং এটি বন্ধ করে দেয়
  • call close(2)stderrপ্রক্রিয়াটির ফাইলডেস্কিপ্টর বন্ধ করে দেয় ( stdoutদায়ের করা ফাইলের জন্য 1)
  • call open(...) একটি নতুন ফাইল খোলে এবং সদ্য নির্মিত ফিলিপস্ক্রিপ্টারের জন্য সর্বনিম্ন অব্যবহৃত পূর্ণসংখ্যা এবং
  • detach PID প্রক্রিয়া অব্যাহত

অন্তত আমার মেশিনে। প্রথম দুটি লাইন POSIX সামঞ্জস্যপূর্ণ তবে তৃতীয় নয়।

openতৃতীয় লাইনে দ্বিতীয় এবং তৃতীয় তর্কটি নথিবদ্ধ করা আছে man 2 open। আমার ক্ষেত্রে 65 এর অর্থ openফাইলটি তৈরি করা উচিত এবং কেবল ফাইলটি লেখার জন্য খুলতে হবে O_WRONLY | O_CREAT(সংজ্ঞায়িত fcntl.h)। তৃতীয় আর্গুমেন্টটি ব্যবহারকারীকে পড়ার এবং লেখার অনুমতি দিয়ে ফাইলটি তৈরি করতে খোলা বলেছে S_IWUSR | S_IRUSR(এতে সংজ্ঞায়িত sys/stat.h)। সুতরাং আপনাকে নিজের দ্বারা নিজের মেশিনে উপযুক্ত মানগুলি খুঁজে পেতে হবে।


এটি এত সুন্দরভাবে কাজ করেছে ... টুপি বন্ধ !!
রোবটিনোসিনো

8

এটি একটি অপরিশোধিত উত্তর এবং আমি আশা করি অন্য কেউ এর থেকে আরও ভাল করতে পারে তবে অন্য কোনও ধারণাগুলি যদি অবতীর্ণ না হয় তবে জিডিবি সংযুক্ত করুন এবং প্রক্রিয়াটিকে কয়েকটি সিস্টেমে করতে বাধ্য করুন:

(gdb) attach 12345 # target PID
(gdb) p close(2)
(gdb) p open("errfile", O_WRONLY)
(gdb) c

নিফটি। আমি জানি না যে জিডিবি এটি করতে পারে। এটি নির্দিষ্ট ফাইল বর্ণনাকারী নাম্বারে বাধ্য করার কোনও উপায় আছে কি? পছন্দ করুন যদি এফডি 1 টি অব্যবহৃত হয়, এবং open()এফডি 1 ধরে? নাকি আপনাকে dup()কয়েকবার ফোন করতে হবে ?
প্যাট্রিক

নেই p open("errfile", O_WRONLY)সত্যিই আপনার মেশিনে কাজ করে?
ব্যবহারকারী 1146332

আপনি একটিতে আটকে যেতে পারেন p dup2(xxx, 2)এবং তারপরে ফেরতের মানটি p close(xxx)কোথায় । এটি কৌশলপূর্ণ স্টাফ, দীর্ঘস্থায়ী প্রক্রিয়াতে এই কমান্ডগুলি ব্যবহার না করা যতক্ষণ না আপনি নিশ্চিত হন যে অন্য কোনও পছন্দ নেই। xxxopen
অ্যালান কারি

@ user1146332 এটি চেষ্টা করার সময় আমি তা করেছি কারণ /dev/nullআমার errfileপ্রয়োজন হিসাবে আমার এটি ব্যবহার করা হয়নি O_CREAT। এবং O_WRONLYম্যাক্রো হ'ল, এটি প্রসারিত হবে কি না তার উপর নির্ভর করে জিডিবি প্রক্রিয়াটি এমন কোনও লাইনে থামিয়েছিল যেখানে ডিবাগিং প্রতীকগুলি পাওয়া যায় এবং ম্যাক্রো সংজ্ঞায়িত হয়। জিডিবি দিয়ে একটি প্রক্রিয়াতে কোড ইনজেকশন বিপজ্জনক এবং কারও কেবল এই আদেশগুলি না বুঝে তাদের অনুলিপি করা উচিত নয়।
অ্যালান কারি

@ অ্যালানক্রোরি আমি মনে করি না যে সাধারণ ডিবাগিংয়ের তথ্য পাওয়া গেলে জিডিবি ম্যাক্রোগুলি প্রসারিত করে। আপনাকে বিশেষ পতাকা সহ উত্সগুলি সংকলন করতে হবে ( এখানে দেখুন )। এছাড়াও এটি খুব অস্বাভাবিক যে আপনার সিস্টেমে নির্বিচারে এক্সিকিউটেবলের মধ্যে ডিবাগিংয়ের তথ্য অন্তর্ভুক্ত রয়েছে (অ্যালোনকে ম্যাক্রো তথ্যের সাথে তথ্য প্রসারিত করা যাক)। তবে আমি আপনার সাথে একমত হই যে কোড ইনজেকশনটি সাধারণত পরামর্শ দেওয়া হয় না তবে এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে আপনি উপকৃত হবেন।
ব্যবহারকারী 1146332
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.