linux - কমান্ড লাইন ব্যবহার করে এটি শুরু হওয়ার পরে কোনও প্রক্রিয়াটির STDERR/STDOUT পুনঃনির্দেশিত করবেন?




bash shell (5)

শেলের মধ্যে আপনি পুনঃনির্দেশকরণ করতে পারেন, > < , ইত্যাদি, কিন্তু কিভাবে একটি প্রোগ্রাম শুরু হওয়ার পরে?

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


Dupx একটি সহজ * nix ইউটিলিটি স্ট্যান্ডার্ড আউটপুট / ইনপুট / ইতিমধ্যে চলমান প্রক্রিয়া ত্রুটি পুনঃনির্দেশ করার জন্য।

https://www.isi.edu/~yuri/dupx/


Vladr এর (এবং অন্যদের ') চমৎকার গবেষণা বন্ধ riffing:

একই ডিরেক্টরির মধ্যে নিম্নলিখিত দুটি ফাইল তৈরি করুন, আপনার পথে কিছু, $ HOME / bin বলুন:

silence.gdb, ধারণকারী (vladr এর উত্তর থেকে):


p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit

এবং নীরবতা, ধারণকারী:


#!/bin/sh
if [ "$0" -a "$1" ]; then
 gdb -p $1 -x $0.gdb
else
 echo Must specify PID of process to silence >&2
fi

chmod +x ~/bin/silence  # make the script executable

এখন, পরের বার আপনি ফায়ারফক্স পুনঃনির্দেশিত করতে ভুলবেন না, উদাহরণস্বরূপ, এবং আপনার টার্মিনাল অনিবার্য "(ফায়ারফক্স-বিন: 5117): GDK-WARNING **: XID সংঘর্ষের সাথে"


ps  # look for process xulrunner-stub (in this case we saw the PID in the error above)
silence 5117  # run the script, using PID we found

যদি আপনি এটি দেখতে না চান তবে আপনি gdb এর আউটপুট / dev / null এ পুনঃনির্দেশ করতে পারেন।


একটি চলমান প্রক্রিয়া থেকে অন্য টার্মিনাল, ফাইল বা পর্দায় আউটপুট পুনঃনির্দেশ করুন:

tty
ls -l /proc/20818/fd
gdb -p 20818

ভিতরে gdb :

p close(1)
p open("/dev/pts/4", 1)
p close(2)
p open("/tmp/myerrlog", 1)
q

ব্যাশ টার্মিনাল থেকে চলমান প্রক্রিয়াটি আলাদা করুন এবং এটি জীবিত রাখুন:

[Ctrl+z]
bg %1 && disown %1
[Ctrl+d]

ব্যাখ্যা:

20818 - চলমান প্রক্রিয়া পিনের একটি উদাহরণ
p - gdb কমান্ডের মুদ্রণ ফলাফল
বন্ধ (1) - বন্ধ মান আউটপুট
/ dev / pts / 4 - লিখতে টার্মিনাল
বন্ধ (2) - বন্ধ ত্রুটি আউটপুট
/ tmp / myerrlog - লিখতে ফাইল
q - gdb ছেড়ে দিন
বিজি% 1 - পটভূমিতে কাজ বন্ধ স্টপ 1
প্রত্যাখ্যান% 1 - টার্মিনাল থেকে চাকরি 1 আলাদা করুন


এটা করবে:

strace -ewrite -p $PID

এটি পরিষ্কার নয় (লাইনগুলি দেখায়: write(#,<text you want to see>) ), কিন্তু কাজ করে!

আপনি আর্গুমেন্ট সংক্ষিপ্ত করা হয় যে সত্য অপছন্দ করতে পারে। যে -s প্যারামিটারটি ব্যবহার করে সেটিকে নিয়ন্ত্রণ করার জন্য সর্বাধিক দৈর্ঘ্যের স্ট্রিং প্রদর্শিত হয়।

এটি সমস্ত প্রবাহগুলি ধরে রাখে, তাই আপনি যে কোনওভাবে ফিল্টার করতে চান:

strace -ewrite -p $PID 2>&1 | grep "write(1" 

শুধুমাত্র বর্ণনাকারী 1 কল দেখায়। 2>&1 STDERR কে STDOUT এ পুনঃনির্দেশিত করতে হয়, কারণ স্ট্রাসটি ডিফল্টরূপে STDERR এ লিখতে পারে।


বন্ধ এবং আপনার TTY পুনরায় চালু (অর্থ লগিং বন্ধ এবং ফিরে, যা প্রক্রিয়ার মধ্যে আপনার কিছু ব্যাকগ্রাউন্ড প্রসেস বন্ধ করতে পারে) সংক্ষিপ্ত আপনি শুধুমাত্র একটি পছন্দ বাকি আছে:

  • gdb ব্যবহার করে প্রশ্ন প্রক্রিয়ার সাথে সংযুক্ত করুন, এবং চালান:
    • পি dup2 (খোলা ("/ dev / null", 0), 1)
    • পি dup2 (খোলা ("/ dev / null", 0), 2)
    • বিচ্ছিন্ন করা
    • অব্যাহতিপ্রাপ্ত

উদাহরণ:

$ tail -f /var/log/lastlog &
[1] 5636

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/pts/0
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog

$ gdb -p 5636
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Attaching to process 5636
Reading symbols from /usr/bin/tail...(no debugging symbols found)...done.
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f3c8f5a66e0 (LWP 5636)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2

(no debugging symbols found)
0x00007f3c8eec7b50 in nanosleep () from /lib/libc.so.6

(gdb) p dup2(open("/dev/null",0),1)
[Switching to Thread 0x7f3c8f5a66e0 (LWP 5636)]
$1 = 1

(gdb) p dup2(open("/dev/null",0),2)
$2 = 2

(gdb) detach
Detaching from program: /usr/bin/tail, process 5636

(gdb) quit

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/null
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog
lr-x------ 1 myuser myuser 64 Feb 27 07:36 4 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 5 -> /dev/null

আপনি বিবেচনা করতে পারেন:

  • screen ব্যবহার করে; পর্দাটি নতুন এসএসএইচ / টেলনেট / ইত্যাদি, সেশনগুলি খোলা ছাড়াই আপনি স্যুইচ করতে পারেন এমন কয়েকটি ভার্চুয়াল টিটিই সরবরাহ করে
  • nohup ব্যবহার করে; এটি আপনাকে প্রক্রিয়ার কোনও পটভূমি প্রক্রিয়া হারাতে ছাড়াই আপনার সেশন বন্ধ এবং পুনরায় খুলতে দেয়।






shell