কোনও ফাইলটিতে লিনাক্স ভার্চুয়াল কনসোল সামগ্রী এবং স্ক্রোলব্যাক সংরক্ষণ করা সম্ভব?


21

আমার একটি দীর্ঘমেয়াদী চলমান স্ক্রিপ্ট রয়েছে এবং আমি এর আউটপুট কোনও ফাইলে পুনর্নির্দেশ করতে ভুলে গিয়েছি। আমি এটি একটি টার্মিনালে দেখতে পাচ্ছি, তবে আমি কি এটি কোনও ফাইলে সংরক্ষণ করতে পারি?

আমি জিজ্ঞেস করছি না tee, আউটপুট ফেরৎ (যেমন >, >>) ইত্যাদি - কমান্ড শুরু করেছে, এবং আমি তা আবার চালাতে পারবে না। আমার ইতিমধ্যে উত্পন্ন আউটপুট সংরক্ষণ করা দরকার। যদি আমি এটি আমার প্রদর্শনটিতে দেখতে পারি তবে এটি কোথাও সঞ্চিত / ক্যাশেড / বাফার হয়েছে। কোথায়?

screendump, /dev/vcsXএবং এর ফলে আমাকে কেবলমাত্র টার্মিনাল আউটপুটে সর্বশেষ পর্দা সংরক্ষণ করতে দেয় (বর্তমান নয়! - স্ক্রোলিং টার্মিনাল সাহায্য করে না)।

এটি লিনাক্স ভার্চুয়াল কনসোলে রয়েছে, কোনও এক্স 11 টার্মিনাল এমুলেটর যেমন gnome-terminalমাউস এবং অন্যান্য গুডির মতো নয়।


1
হ্যাঁ, যেহেতু আপনি এটি দেখতে পাচ্ছেন, এটি কোথাও রয়েছে। দুর্ভাগ্যক্রমে, যে কোথাও প্রদর্শন জন্য হার্ডওয়্যার ফ্রেম বাফার হয়। এটি ডিসপ্লে হার্ডওয়্যার থেকে ছিঁড়ে ফেলার চেয়ে এটি নিজে হাতে অনুলিপি করা আরও সহজ হবে।
এমএসডব্লু

মজাদার! কিন্তু ... এটি একা কোথাও অনুপস্থিত /dev/, ঠিক যেমন আছে তাইনা? অন্যথায়, আপনি কীভাবে এটি পৌঁছাতে হবে তা লিখেছেন।
জুরি

উত্তর:


19

/dev/vcs[a]<n>আপনি কেবল স্ক্রোল করে থাকলেও কেবল আপনাকে সর্বশেষ স্ক্রিন-পূর্ণ পাবেন, তবে ioctl()ব্যবহার হিসাবে করা নির্বাচন আপনাকে স্ক্রল আপ gpmকরার পরেও প্রদর্শিত প্রদর্শিত পর্দা ডাম্প করার অনুমতি দেবে।

সুতরাং আপনি এটি করতে পারেন:

sleep 3; perl -e '
  require "sys/ioctl.ph";
  # copy:
  ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, 80, 25, 2));
  # paste:
  ioctl(STDIN, &TIOCLINUX, $arg = "\3")'; cat > file

আপনার প্রকৃত পর্দার প্রস্থ এবং উচ্চতাতে 80 এবং 25 কে সামঞ্জস্য করুন।

sleep 3আপনি (আপ স্ক্রল সময় পাবেন, Shift+PageUP) প্রকৃত পর্দা আপনাকে ডাম্প করতে চান। cat > fileপেস্টটি পুনর্নির্দেশ করে file। এটি দিয়ে শেষ Ctrl+D

দেখুন console_ioctl(4)বিস্তারিত জানার জন্য।

আপনি যদি gpmইনস্টল ও চালিত হয়ে থাকেন তবে মাউস দিয়ে সেই নির্বাচনটি করতে পারেন।

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


পুরো স্ক্রোলব্যাক বাফারটি ডাম্প করার জন্য প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চালানোর জন্য, এটি কিছু শর্তে সম্ভব হওয়া উচিত, তবে এপিআই খুব সীমাবদ্ধ হওয়ায় এটি বেশ কঠিন। ioctlকিছু অফসেট (স্ক্রোলিংয়ের জন্য নেতিবাচক, নীচে স্ক্রোল করার জন্য ধনাত্মক) দ্বারা বর্তমান ভার্চুয়াল কনসোলটি স্ক্রোল করার জন্য একটি অননুমোদিত (TIOCLINUX, সাবকোড = 13) রয়েছে।

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

আমি স্ক্রোলিং আইওসিটিএল এরেটিক (কমপক্ষে ভিজিএ কনসোল সহ) এর আচরণটিও পাই, যেখানে 4 টিরও কম লাইনের মাধ্যমে স্ক্রোলিং কেবল মাঝে মাঝে কাজ করে।

নীচের স্ক্রিপ্টটি আমার জন্য ফ্রেম বাফার কনসোলগুলিতে (এবং মাঝে মাঝে ভিজিএর উপরও) কাজ করে বলে মনে হচ্ছে শর্তিত যে স্ক্রোলব্যাক বাফারটিতে একটি স্ক্রিন প্লাস ওয়ান লাইনের চেয়ে বেশি লম্বা লম্বা লাইনগুলির ক্রম থাকে না।

এটি বেশ ধীর কারণ এটি একবারে একটি লাইন স্ক্রোল করে এবং প্রতিটি স্ক্রিন ডাম্প পড়ার সময় 10 মিমি অপেক্ষা করতে হবে to

that-script > fileভার্চুয়াল কনসোলের মধ্যে থেকে হিসাবে ব্যবহার করা ।

#! /usr/bin/perl
require "sys/ioctl.ph";
($rows,$cols) = split " ", `stty size`;
$stty = `stty -g`; chomp $stty;
system(qw(stty raw -echo icrnl min 0 time 1));

sub scroll {
  ioctl(STDIN, &TIOCLINUX, $arg = pack("Cx3l", 13, $_[0])) or die "scroll: $!";
}
sub grab {
  ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, $cols, $rows, 2)) or die "copy: $!";
  ioctl(STDIN, &TIOCLINUX, $arg = "\3") or die "paste: $!";
  return <STDIN>;
}
for ($s = 0;;$s--) {
  scroll $s if $s;
  @lines = grab;
  if ($s) {
    last if "@lines" eq "@lastlines";
    unshift @output, $lines[0];
  } else {
    @output = @lines;
  }
  @lastlines = @lines;
}
print @output;
exec("stty", $stty);

0

https://github.com/jerome-pouiller/reredirect/ একটি বিকল্প হতে পারে?

বর্ণনা:

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

বাক্য গঠনটি নিম্নরূপ:

reredirect -m FILE PID

7
এটি ইতিমধ্যে উত্পন্ন আউটপুট সংরক্ষণ করে না যেমন ওপি জিজ্ঞাসা করেছে, কেবলমাত্র নতুন আউটপুট কোথাও পুনঃনির্দেশিত হবে।
জিম্মিজ

1
এটি সত্য ...
এডিওনডিটসাক

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