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


159

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

এটি করার একটি উপায় আমি ভেবেছিলাম এটির মালিকানা কোনও স্ক্রিন শেল এ স্থানান্তর করা, এভাবে এটি সেখানে চালিয়ে যাওয়া।

এগিয়ে যাওয়ার কি আলাদা উপায় আছে?


8
আরও দেখুন কি আমি ইতিমধ্যে শুরু হওয়া প্রক্রিয়াটি নোপ / স্ক্রিন করতে পারি? এবং বাদ SSH সেশান চলমান কমান্ড পুনরায় শুরু করুন , যা বিভিন্ন ptrace ভিত্তিক সমাধান না (বর্তমানে) এখানে উল্লেখ উল্লেখ।
গিলস

Unix.stackexchange.com/a/4039/13496 এর মতো প্রশ্নগুলি থেকে আমি রিটি এবং নিউকার্স সম্পর্কে শুনছি । হুম ... আশ্চর্য কি যদি পরের বার কোনও প্রক্রিয়া চালানোর আগে " স্ক্রিন এখানে" লেয়ারের মতো স্মিথ থাকে তবে ভবিষ্যতে আমার শীর্ষ টার্মিনালটি হারাতে হবে, এটি স্টিডিন / আউট / এরিরে ফিরে আসা সহজ করে দেবে
মার্কোস

এই প্রশ্নের দ্বিতীয় বা অন্তর্ভুক্ত ইস্যুটি আমি বুঝতে পারি না ... যখন নতুন / সবেমাত্র চালু করা ব্যাকগ্রাউন্ডে স্ট্যান্ডিনের অপেক্ষার প্রয়োজন নেই তখন কেন শেল স্থগিত কাজ অস্বীকার করা বেছে নিয়েছিল? এই চিকিত্সাটি আমি ব্যবহার করেছি তাই জানেন না এখানে কী আলাদা হয়েছিল ...
মার্কোস

উত্তর:


86

জিএনইউ ব্যবহার screenকরা আপনার সেরা বাজি।

পর্দা চলমান শুরু যখন আপনি যদি প্রথম লগইন - আমি চালানোর screen -D -Rজন্য, আপনি আপনার কমান্ড চালানোর জন্য, এবং পারেন সংযোগ বিচ্ছিন্ন বা সঙ্গে এটি স্থগিত CTRL-Zএবং তারপর টিপে পর্দা থেকে সংযোগ বিচ্ছিন্ন CTRL-Aতারপর D

আপনি আবার মেশিনে লগইন করার পরে, চালিয়ে পুনরায় সংযোগ করুন screen -D -R। আপনি আগের মতো একই শেলের মধ্যে থাকবেন। আপনি jobsযদি তা করে থাকেন তবে আপনি স্থগিত হওয়া প্রক্রিয়াটি দেখতে দৌড়াতে পারেন এবং %1এটিকে আবার পূর্বাভাস করতে (বা সম্পর্কিত কাজ #) চালাতে পারেন।


2
বাহ, আমি বিশ্বাস করতে পারি না জিএনইউ স্ক্রিনের একটি উত্তর বর্তমানে সর্বনিম্ন রেটযুক্ত। আমি কিছু অনুপস্থিত করছি?
ফাহিম মিঠা

1
সম্ভবত! আমার কাছে সেরা বলে মনে হচ্ছে।
অ্যান্ড্রু ইওচুম

1
পিছনে ফিরে তাকালে, এটি স্পষ্টতই সবচেয়ে বেদনাদায়ক সমাধান বলে মনে হচ্ছে আপনি যদি সেই অনুযায়ী পরিকল্পনা করতে পারেন এবং আপনার প্রক্রিয়াগুলি কোনও পর্দার পরিবেশের মধ্যে থেকে চালু করতে পারেন তবে। যাইহোক, আমি এটি সরকারী উত্তর তৈরি!
লেভেস্ক

28
আমি মনে করি এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি " আমার একটি প্রোগ্রাম চলছে " দিয়ে শুরু হয় । এই উত্তরটি ধরে নিয়েছে যে এটি এখনও চলছে না ...
আনকো

হ্যাঁ তিনি স্পষ্টভাবে লিখেছিলেন তিনি এটিকে একটি স্ক্রিন সেশনে নিয়ে যেতে চান :-)
ফ্লোরিয়ান হিগল

112

আপনি disownবিল্ট-ইন দিয়ে শেল থেকে প্রোগ্রামটির "মালিকানা" প্রত্যাহার করতে পারেন :

# press Ctrl+Z to suspend the program
bg
disown

তবে এটি কেবল শেলকে বলে SIGHUPযে শেলটি প্রস্থান করার সময় প্রোগ্রামে একটি সংকেত না পাঠায় । প্রোগ্রামটি সাধারণত টার্মিনালের সাথে এটির যে কোনও সংযোগ বজায় রাখে, সাধারণত স্ট্যান্ডার্ড ইনপুট, আউটপুট এবং ত্রুটির প্রবাহ হিসাবে। এগুলি অন্য টার্মিনালে পুনরায় সংযুক্ত করার কোনও উপায় নেই। ( প্রতিটি উইন্ডোটির জন্য টার্মিনাল অনুকরণ করে স্ক্রিন কাজ করে, সুতরাং প্রোগ্রামগুলি স্ক্রিন উইন্ডোতে সংযুক্ত থাকে))


এটা একটা ডিবাগার প্রোগ্রাম সংযোজনের (অর্থাত ব্যবহার করে একটি ভিন্ন ফাইলে filedescriptors পুনরায় সংযুক্ত করা সম্ভব ptrace) এবং কল করার open, dupএবং close। এটি করার জন্য কয়েকটি সরঞ্জাম রয়েছে; এটি একটি জটিল প্রক্রিয়া, এবং কখনও কখনও তারা পরিবর্তে প্রক্রিয়াটি ক্রাশ করে দেয়। সম্ভাবনার অন্তর্ভুক্ত রয়েছে ( আমি কীভাবে চলমান প্রক্রিয়াটিকে অস্বীকার করব এবং এটি একটি নতুন স্ক্রিন শেলের সাথে যুক্ত করব? এবং আমি কি ইতিমধ্যে শুরু হওয়া প্রক্রিয়াটি নোপ / স্ক্রিন করতে পারি? ):


disownকাজটি নিয়ন্ত্রণ-তালিকা থেকে প্রক্রিয়াটি সরিয়ে দেয়।
ctrl-alt-delor


@ চিজটিম্মারম্যান শেল এর কাজের টেবিলে কাজ ছেড়ে দিয়েছে, তবে এর সুবিধা কী?
গিলস

@ গিলস: যাতে আপনি এখনও fgবা killএটি করতে পারেন এবং দেখুন এটি নিজের থেকে শেষ হয় কিনা।
পিটার কর্ডেস

উল্লিখিত ইউটিলিটিগুলি একটি গ্রুপের প্রক্রিয়াগুলির সাথে কাজ করে (উদাঃ bzcat a.bz2 | grep text)? ম্যান ফর reptyrবলেছেন যে এটি বাচ্চাদের সাথে প্রক্রিয়াগুলি সরিয়ে নেওয়া সমর্থন করে না।
dma_k

64

টার্মিনালের মধ্যে একটি প্রক্রিয়া স্থানান্তর করতে বা অস্বীকার করা পুনরায় সংযুক্তি করতে, আপনি যেমন reptyr ব্যবহার করতে পারেন ।


1
হ্যাঁ, এটি এটি সংরক্ষণ করেছে, ধন্যবাদ! আমি লেখকের ওয়েবসাইটটি পড়ি কীভাবে এটি অনুরূপ বা পুরানো সরঞ্জামগুলির চেয়ে ভাল কাজ করে eg Ncurses প্রোগ্রামের জন্য।
মার্কোস

4
এটা সত্যিই দারুন; এটিকে সরাসরি কাজকর্মের মাধ্যমে এটি চালিয়ে চালানোর এবং তারপরে ট্রেনে উঠার প্রয়োজনে ক্রমাগত তার কাজের হারানো বন্ধুর কুফলটি সমাধান করা উচিত। "উফ, পর্দা ব্যবহার করতে ভুলে গেছি Again আবার।"
আদম কাটজ

3
+1 যদিও গৃহীত screenউত্তর অবশ্যই আদর্শ, তবুও এটি আসলে প্রশ্নের উত্তর দেয় না, যা বর্তমানে চলমান প্রক্রিয়াটিকে বা তার মতো করে সরানোর জন্য বিশেষভাবে অনুরোধ screenকরে। এই উত্তরটিও
toxefa

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

28

আমার প্রিয় সমাধানটি ব্যবহার করছে tmux, আপনি সেশনটি আলাদা করতে পারবেন এবং এটি অন্য টার্মিনালে পুনরায় সংযুক্ত করতে পারেন।

আপনি পূর্ববর্তী অধিবেশন থেকে বিচ্ছিন্ন হয়ে গেলে, আপনি নিরাপদে টার্মিনালটি বন্ধ করতে পারেন; পরে tmux attachসেশনটিতে ফিরে যেতে ব্যবহার করুন, এমনকি আপনি লগ আউট করেছেন।


1
আপনি আপনার সেশনটি আপনার বন্ধুর সাথে ভাগ করে নিতে পারেন এবং একাধিক উইন্ডো এবং প্যান ব্যবহার করতে পারেন এবং আরও অনেক কিছু! এটি ভালবাসুন ^ _ ^
আইগোর

দয়া করে ব্যবহারের উদাহরণ?
ভাইটালি জাদানেভিচ

21

রেটি নামে একটি ছোট্ট ইউটিলিটি রয়েছে যা আপনাকে অন্য টার্মিনালে চলমান প্রোগ্রামগুলি পুনরায় সংযুক্ত করতে দেয়।


19

আমি এটি নিয়মিত ব্যবহার করি না, তবে নীরকরা এটি সমর্থন করার দাবি করে। এটি আরও screenভাল ফলক পরিচালনার মতো বিবিধ অভিনব বৈশিষ্ট্য সহ একটি প্রোগ্রাম- এর মতো প্রোগ্রাম, তবে এটি যে প্রধান জিনিস দেয় তা হ'ল একটি ফলকে একটি প্রক্রিয়া আমদানি করার ক্ষমতা


2
মজাদার. এটি নোংরা ( ptrace) খেলে , তবে এটি কেবল ফাইল বর্ণনাকারীদের হেরফের করে না, এটি প্রক্রিয়াটিকে কাঁপায়। এটি দখল করতে সক্ষম find /, তবে একটি ইন্টারেক্টিভ ব্যাশ ক্র্যাশ করেছে।
গিলস

@ গিলস আমি যখন চেষ্টা করেছিলাম তখন এটি কীভাবে হয়েছিল তা আমি মনে করতে পারি না, তবে এর কোনও খ্যাতি নেই, আমাকে বলা হয়েছে এটি নিয়মিত ব্যর্থ হয়
মাইকেল মরোজেক

9

আপনি যদি কেবল এটি বিরতি দিতে চান এবং পরে পুনরায় চালু করতে চান তবে আপনি ব্যবহার killকরতে STOPবা CONTসিগন্যাল ব্যবহার করতে পারেন ।

প্রথমে পিআইডি সহ প্রক্রিয়াগুলি সন্ধান করুন

$ ps aux

তারপরে প্রক্রিয়াটিতে তালিকাভুক্ত পিআইডিতে সংকেতগুলি প্রেরণ করুন

$ kill -STOP <PID>

$ kill -CONT <PID>

9

টমাসহাবেটসের "ইনজকোড" মনে হচ্ছে ঠিক আমার প্রয়োজন মতো জিনিস:

https://github.com/ThomasHabets/injcode

ইনজকোড প্রোগ্রামটি সালমান কোডটিকে চলমান প্রক্রিয়াতে ইনজেকশনের মঞ্জুরি দেয়, আপনি আগে জানতেন এবং না পর্দা বা tmux চলছে কিনা

পুনরায় পড়া থেকে:

উদাহরণ 1: ইরসিকে এক টার্মিনাল থেকে অন্য টার্মিনালে সরান

হতে পারে এটি একটি পর্দায় সরানো।

প্রথমে একটি টার্মিনালে ইরসি শুরু করুন।

অন্য টার্মিনালে ইনকোড চালান: $ ইনকোড-এম রেটি

ইরশিকে এখন নতুন কন্ট্রোলিং টার্মিনাল সহ দ্বিতীয় টার্মিনালে সরানো উচিত।


1

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

  1. bg প্রক্রিয়া
  2. jobs -l প্রক্রিয়া নম্বর সন্ধান করুন
  3. tmux শেল উইন্ডো ম্যানেজার শুরু করুন
  4. reptyr -L PROCESSNUMBER

reptyrএর -Lকাজ এই পেতে প্রয়োজনীয় ছিল:

-L Like '-l', but also redirect the child's stdio to the slave.

এই ত্রুটির কারণে:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

এবং সাথে -L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.