এসএসএইচ থেকে লগআউট করার পরে বর্তমানে চলমান লিনাক্স টাস্কটি নিহত হওয়ার রোধ করুন


18

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

আমি স্থানীয় মেশিনটি পুনরায় চালু করতে চাই (সার্ভার নয়) যেখান থেকে আমি ssh সেশনটি খুলেছি, তবে টাস্কটি চালিয়ে যেতে চাই। এটা কি সম্ভব?

উত্তর:


22

আপনার টাস্ক ইতিমধ্যে চালু করা হয়, তাহলে এটা খুব দেরি হয়ে *বিকল্প সমাধান বিবেচনা করা জরুরী যে আপনার মধ্যে একটি অতিরিক্ত স্তর সন্নিবেশ sshঅধিবেশন এবং শেল কমান্ড চলমান, মত screen, tmux, byobu, nohupএবং পছন্দগুলি।

আপনার প্রক্রিয়া সমর্থন পটভূমি মধ্যে স্থাপন করা থাকলে হবে এবং বিশেষ করে যখন স্তব্ধ করে না stdoutএবং stderrunwritable / বন্ধ করা হয়, আপনার সাথে লগ আউট করার পূর্বে পটভূমিতে এটা লাগাতে পারেন ControlZএবং bgতারপর সঙ্গে আপনার শেল থেকে এটা বিচ্ছিন্ন disownbuiltin।

উদাহরণ:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

*বব যেমন মন্তব্য করেছিলেন, লিনাক্সের অধীনে একটি টিটিটি অধিবেশন পুনর্বার করার বিভিন্ন উপায় রয়েছে। repty, retty , ইনকোড এবং neercs । সর্বাধিক উন্নত চেহারা reptyr হতে পারে তবে আপনার প্রক্রিয়া হ্যাক করার জন্য ptrace সক্ষম করার জন্য আপনার রুট সুবিধার দরকার হতে পারে।


আমি Ctrl + Z ব্যবহার করেছি, কাজটি বন্ধ হয়ে পটভূমিতে চলে গেছে, তারপরে disownকমান্ডটি সম্পাদন করেছে । এটা তোলে ফিরে ব্যাশ: সতর্কতা: প্রক্রিয়া গ্রুপ 24876. এখন আমার কাজ তালিকাভুক্ত করা হয় সঙ্গে কাজ 1 থামানো মোছা ps -allকিন্তু কাজ করছে না বলে মনে হচ্ছে (CPU ব্যবহার 0% হয়)
আলী

দেখে মনে হচ্ছে আমার প্রক্রিয়া বন্ধ হয়ে গেছে। আমার ধারণা আমি disownকমান্ড সহ প্রসেস আইডি সরবরাহ করা উচিত ছিল
আলী

@ অলি আমার মনে হয় আপনি স্থগিত কাজটি আবার শুরু করতে বিজি কমান্ড চালাতে ভুলে গেছেন।
জেসন ঝু 21

1
@ জেসনঝু তা দেখানোর জন্য ধন্যবাদ। bgআমার জবাবের প্রথম অংশে কমান্ডের প্রয়োজনীয়তা ছিল এটি অস্পষ্ট ছিল। সম্পাদনা করা হয়েছে।
jlliagre

2
আপনি যদি বিজি কমান্ডটি ভুলে যান এবং কেবল অস্বীকার করা কমান্ডটি চালিয়ে যান তবে আপনার প্রক্রিয়াটি আবার চলতে সক্ষম হবে kill -CONTযা বিজি প্রায় একই রকম করবে।
ক্যাস্পারড

5

একটি সমাধান হ'ল জিএনইউ স্ক্রিন ব্যবহার করা । আপনি শুরু করতে পারেন screen, আপনার আদেশটি চালাতে পারেন, তারপরে বিচ্ছিন্ন C-a d। পরে, পুনরায় সংযোগ করতে, করতে screen -rএবং আপনি আপনার আগের সেশনে ফিরে এসেছেন।

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

সম্পাদনা: মন্তব্যে উল্লিখিত হিসাবে, এটি কেবলমাত্র তখনই কাজ করবে যদি আপনি screenকমান্ডটি চালানোর আগে মনে করতে শুরু করেন। যদি কমান্ডটি ইতিমধ্যে চলমান থাকে তবে আপনার প্রয়োজন @ jlliagre এর সমাধান।


2
tmuxএর মতো অন্য একটি প্রোগ্রাম screenআপনাকে একটি রিমোট সেশন করতে দেয় যা আপনার বর্তমান এসএসএইচ সংযোগের সাথে আবদ্ধ নয়।
ডারথ অ্যান্ড্রয়েড

2
আপনার সমাধান দুর্দান্ত। তবে এটি আমার প্রশ্নের সাথে পুরোপুরি খাপ খায় না - আমি বর্তমানে চলমান প্রক্রিয়া সম্পর্কে জিজ্ঞাসা করেছি, ভবিষ্যতে ব্যবহার করে কোনও প্রক্রিয়া চালানো হবে না screen
আলী

আহ ঠিক আছে. সেক্ষেত্রে আমার মনে হয় আপনার @ jlliagre এর সমাধানটি ব্যবহার করা দরকার। (আমি যতদূর জানি, ইতিমধ্যে চলমান প্রক্রিয়াটিকে screenবা এর মতো কোনও কিছুর সাথে সংযুক্ত করার কোনও উপায় নেই tmux))
স্কট ওয়েলডন

1

এটি করার একটি "স্ট্যান্ডার্ড" উপায়গুলির মধ্যে একটি হ'ল nohupকমান্ডটি ব্যবহার করা , এতে অন্তর্ভুক্ত coreutils:

nohup COMMAND [ARGS] &

কিন্তু কমান্ডটি প্রোগ্রামের আউটপুট ( STDOUT& STDERRএএফআইকে) কে একটি ফাইলে পুনর্নির্দেশ করবে nohup.out, এটি কখনও কখনও বিরক্ত করে তোলে (কখনও কখনও বিশাল লগ ফাইল তৈরি করে), সুতরাং আপনি নিজের পুনঃনির্দেশটি তৈরি করতে চাইতে পারেন, বা এটিকে / dev / null এ পুনঃনির্দেশ করতে চাইতে পারেন তুমি যদি চাও.


2
আবার পড়তে. প্রক্রিয়া ইতিমধ্যে চলছে
মনিকার সাথে লাইটনেস রেস

/ লজ্জা মনোযোগ দিয়ে পড়েনি। দুঃখিত।
wangguoqin1001

আসলে nohupএই জন্য ব্যবহার করা যেতে পারে। কেবল চলমান প্রক্রিয়া স্থগিত করুন এবং এটি ব্যাকগ্রাউন্ডে প্রেরণ করুন ( Ctrl+ Zএবং রান করুন bg) এবং তারপরে আপনি ইস্যু করতে পারবেন nohup %1
মাইক

0

এছাড়াও nohupআপনি "&" এবং সাব-শেল ব্যবহার করে পটভূমিতে প্রক্রিয়াটি শুরু করতে পারেন:

কমান্ডটি প্রত্যাহার করুন এবং এটিকে প্রথম বন্ধনীতে আবদ্ধ করুন

$ (thecommand args &)

আপনার প্রক্রিয়াটি পিড 1922 বলে দেয়:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

দেখুন যে এটি শেল প্রক্রিয়া 11473 যা এটির আসল পিতামাতার সাথে সংযুক্ত। সুতরাং, যদি আপনি বর্তমান শেলটি (11473) থেকে প্রস্থান করেন বা হত্যা করেন, তবে 11922 প্রক্রিয়াটি চলতে থাকবে, এবং এটি পিটিএস থেকে সংযোগ বিচ্ছিন্ন হয়ে যাবে।

শেলটি থেকে প্রস্থান করার চেষ্টা করুন এবং একটি নতুন শেল প্রবেশ করুন। এমনকি, এই শেলটি একই পিটিএসের সাথে সংযুক্ত থাকলেও আপনি এখন পিটিএস ছাড়াই প্রক্রিয়াটি দেখতে পারবেন:

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

পোজিক্সে কীভাবে এটি ডাকা বা ডকুমেন্ট করা যায় তা আমি করি না তবে আমি ১৯৯০ সাল থেকে bsh, ksh এবং এখন ব্যাশে এইভাবে ব্যবহার করি।

শেষ অবধি, আপনি bgবিল্টিন শেল কমান্ডটি ব্যবহার করতে পারেন :

কেবলমাত্র আপনার প্রোগ্রামটি চালু করুন এবং আপনি যদি এটি বিরতি দেওয়ার সিদ্ধান্ত নেন বা এটি ব্যাকগ্রাউন্ডে রাখার পরিকল্পনা করেন তবে CTRL + Z টাইপ করুন:

$ thecommand
^Z
[1] Stopped          thecommand

এখন এটি পটভূমিতে চালিয়ে যেতে দিন:

$ bg
[1]+ thecommand &

আপনি যদি প্রক্রিয়াটি ইনফোসের দিকে তাকান তবে এর এখনও একটি পিতামাতার প্রক্রিয়া রয়েছে:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

সুতরাং, বর্তমান প্রক্রিয়া থেকে প্রস্থান করুন। পটভূমিতে চলমান প্রক্রিয়াটি তার মূল পিতামাতার কাছ থেকে দূরে রয়েছে এবং পটভূমিতে চলতে থাকবে:

$ exit

আবার লগইন করুন এবং প্রক্রিয়া তথ্য দেখুন:

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.