আমি কীভাবে ইতিমধ্যে চলমান প্রক্রিয়াটিকে নোহুপের নীচে রাখব?


940

আমার একটি প্রক্রিয়া রয়েছে যা ইতিমধ্যে দীর্ঘকাল ধরে চলছে এবং এটি শেষ করতে চাই না।

আমি কীভাবে এটিকে নোহুপের নীচে রাখি (এটি আমি টার্মিনালটি বন্ধ করে দিলেও কীভাবে এটি চলতে থাকবে?)


29
একই সমস্যার মুখোমুখি যে কারও কাছে: মনে রাখবেন যে আপনি টাইপ করেও yourExecutable &আউটপুটগুলি স্ক্রিনে আসতে থাকে এবং Ctrl+Cকোনও কিছু থামায় বলে মনে হয় না, কেবল অন্ধভাবে টাইপ করে disown;চাপুন Enterএমনকি পর্দা আউটপুটগুলির সাথে স্ক্রোল করছে এবং আপনি কী দেখতে পাচ্ছেন না আপনি টাইপ করছেন প্রক্রিয়াটি অস্বীকার হয়ে যাবে এবং আপনি প্রক্রিয়াটি মারা যাওয়া ছাড়াই টার্মিনালটি বন্ধ করতে সক্ষম হবেন।
নাভ

উত্তর:


1367

প্রক্রিয়াটিকে ব্যাকগ্রাউন্ডে প্রেরণ করতে ব্যাশের কাজ নিয়ন্ত্রণ ব্যবহার করুন :

  1. Ctrl+ Zপ্রোগ্রামটি থামাতে (বিরতি দিতে) এবং শেলের কাছে ফিরে যেতে।
  2. bg পটভূমিতে এটি চালাতে।
  3. disown -h [job-spec]যেখানে [জব-স্পিপ] হ'ল জব নম্বর ( %1প্রথম চলমান কাজের মতো; jobsকমান্ড সহ আপনার নম্বরটি সন্ধান করুন ) যাতে টার্মিনাল বন্ধ হয়ে গেলে কাজটি মারা না যায়।

38
প্রশ্নটি কীভাবে "এটিকে নোহুপের অধীনে রাখবেন", disown -hসম্ভবত আরও সঠিক উত্তরটি হ'ল: "অস্বীকার করা নোহুপের মতো আচরণ করুন (যেমন আপনার শেলটি প্রস্থান না করা পর্যন্ত কাজগুলি আপনার বর্তমান শেলের প্রসেস ট্রিতে থাকবে) এটি আপনাকে দেখতে দেয় এই শেলটি যে সমস্ত কাজ শুরু করেছিল তা " ([ কোয়ান্টর প্রিন্সিপাল / ইনভেস্ট / ইন্ডেক্স.এইচপি / ডকস / টিপস্যান্ডট্রিক্স / ইউনিক্স/… থেকে )
ডাঃ জান-ফিলিপ গেহর্ককে

8
আমি কীভাবে পরে কাজটি পুনরুদ্ধার করব? আমি এটি PS -e ব্যবহার করে চলতে দেখতে পাচ্ছি।
পাওলো ক্যাসারেটো

26
আপনি কোনও কাজের পরে আউটপুট দেখতে পাচ্ছেন না disown, অস্বীকৃত একটি প্রক্রিয়াকে ডেমন করে তোলে যার অর্থ স্ট্যান্ডার্ড ইনপুট / আউটপুট / dev / নালকে পুনঃনির্দেশিত করা হয়। সুতরাং, আপনি যদি কোনও চাকুরী অস্বীকার করার পরিকল্পনা করেন তবে কোনও ফাইলটিতে লগইন করে এটি শুরু করা ভাল eg উদাহরণস্বরূপmy_job_command | tee my_job.log
রাস্টিক্স

8
'মাই_জব_কম্যান্ড | এর মতো কিছু করা কি সম্ভব? টি মাই_জব.লগ ' কমান্ড ইতিমধ্যে চালু হওয়ার পরে ?
আর্ড করুন

23
disownপ্রক্রিয়া থেকে কোনও পাইপ বিচ্ছিন্ন করে। পাইপগুলিকে পুনরায় সংযুক্ত করতে, এই থ্রেডেgdb বর্ণিত হিসাবে ব্যবহার করুন । আরও নির্দিষ্টভাবে, এই পোস্ট
mbrownnyc

185

মনে করুন যে কোনও কারণে Ctrl+ Zএছাড়াও কাজ করছে না, অন্য টার্মিনালে যান, প্রক্রিয়া আইডিটি (ব্যবহার করে ps) সন্ধান করুন এবং চালান:

kill -SIGSTOP PID 
kill -SIGCONT PID

SIGSTOPপ্রক্রিয়া স্থগিত SIGCONTকরবে এবং পটভূমিতে প্রক্রিয়াটি আবার শুরু করবে। সুতরাং এখন, আপনার উভয় টার্মিনাল বন্ধ করা আপনার প্রক্রিয়াটি থামবে না।


10
হ্যাঁ, একটি ওএসের সমস্যা রয়েছে, উইন্ডোজে সাইগউইনের সাথে কিল কাজ করে না।
পাংস

6
কাজটি আরও একটি ssh অধিবেশন থেকে শুরু করা হয় এছাড়াও খুব দরকারী।
আমির আলী আকবরী

5
disown %1এটি বন্ধ করার আগে প্রথম টার্মিনালে কেবল মনে রাখবেন ।
ফ্রেড

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

@ ফ্রেড আমি এটি করিনি এবং মনে হচ্ছে এটি চলমান থাকবে। সম্ভব নাকি আমি ভুল পিআইডি মারলাম?
কেউ

91

একটি চলমান কাজ শেল থেকে পৃথক করার কমান্ড (= এটি disownকোনও নোপআপ করে তোলে) এবং একটি বেসিক শেল-কমান্ড।

বাশ-ম্যানপেজ (ম্যান বাশ) থেকে:

অস্বীকার করুন [-আর] [-হ] [জবস্পেক ...]

বিকল্পগুলি ব্যতীত প্রতিটি জবস্পেক সক্রিয় কাজের সারণী থেকে সরানো হবে। যদি -h বিকল্পটি দেওয়া হয়, প্রতিটি জবস্পেকটি টেবিল থেকে সরিয়ে ফেলা হয় না, তবে চিহ্নিত করা হয় যাতে শেলটি যদি একটি SIGHUP পান তবে SIGHUP কাজটিতে প্রেরণ করা হয় না। যদি কোনও জবস্পেক উপস্থিত না থাকে এবং -আর বা -r বিকল্পটি সরবরাহ না করা হয় তবে বর্তমান কাজটি ব্যবহৃত হয়। যদি কোনও জবস্পেক সরবরাহ না করা হয়, -এ বিকল্পের অর্থ সমস্ত কাজ সরিয়ে বা চিহ্নিত করা; জবস্পেক আর্গুমেন্ট ছাড়াই -r বিকল্পটি চলমান কাজগুলিতে অপারেশনকে সীমাবদ্ধ করে। যদি কোনও জবস্পেক কোনও বৈধ কাজ নির্দিষ্ট না করে তবে ফেরতের মান 0 হয়।

তার মানে, এটি একটি সরল

disown -a

জব-টেবিল থেকে সমস্ত কাজ সরিয়ে ফেলবে এবং তাদের অহরহ করে তুলবে


9
disown -aসমস্ত কাজ সরিয়ে দেয়। একটি সাধারণ disownকেবল বর্তমান কাজ সরিয়ে দেয়। উত্তরের ম্যান পেজ যেমন বলে।
রুন শেজেলরাপ ফিলোসোফ

73

এগুলি উপরের উত্তরের উত্তর, আমি কেবল একটি স্পেসিফিকেশন যুক্ত করতে চেয়েছিলাম:

আপনি একটি কাজ disownবা প্রক্রিয়া করতে পারবেন না , আপনি disownএকটি কাজ এবং এটি একটি গুরুত্বপূর্ণ পার্থক্য।

একটি কাজ এমন একটি প্রক্রিয়া যা শেলের সাথে সংযুক্ত একটি ধারণার ধারণা, তাই আপনাকে কাজটি পটভূমিতে ফেলে দিতে হবে (এটি স্থগিত করা হবে না) এবং তারপরে এটি অস্বীকার করতে হবে।

সমস্যা:

%  jobs
[1]  running java 
[2]  suspended vi
%  disown %1

দেখুন http://www.quantprinciple.com/invest/index.php/docs/tipsandtricks/unix/jobcontrol/ ইউনিক্স চাকরির কন্ট্রোল আরো বিস্তারিত আলোচনার জন্য।


48

দুর্ভাগ্যক্রমে disownবাশ নির্দিষ্ট এবং সমস্ত শেল উপলভ্য নয়।

ইউনিক্সের নির্দিষ্ট স্বাদের (যেমন এআইএক্স এবং সোলারিস) nohupকমান্ডটিতে নিজেই একটি বিকল্প রয়েছে যা একটি চলমান প্রক্রিয়াতে প্রয়োগ করা যেতে পারে:

nohup -p pid

Http://en.wikedia.org/wiki/Nohup দেখুন


শুধুমাত্র AIXএবং জন্য Solaris। "নোহুপের এআইএক্স এবং সোলারিস সংস্করণগুলিতে একটি -p বিকল্প রয়েছে যা ভবিষ্যতে সিএইচইউপি সংকেতগুলি উপেক্ষা করার জন্য একটি চলমান প্রক্রিয়াটি পরিবর্তন করে। উত্স
অ্যালিক্লিজিন-কিলাকা

27

নোডের উত্তরটি সত্যিই দুর্দান্ত, তবে কীভাবে স্টডআউট এবং স্টাডার পুনঃনির্দেশিত হতে পারে তা এই প্রশ্নটি ছেড়ে দিয়েছে। আমি ইউনিক্স এবং লিনাক্সে একটি সমাধান পেয়েছি , তবে এটিও সম্পূর্ণ নয়। আমি এই দুটি সমাধান একত্রীকরণ করতে চাই। এটা এখানে:

আমার পরীক্ষার জন্য আমি loop.sh নামে একটি ছোট বাশ স্ক্রিপ্ট তৈরি করেছি, যা একটি অসীম লুপে এক মিনিটের ঘুমের সাথে নিজের পিড মুদ্রণ করে।

$./loop.sh

এখন কোনওভাবে এই প্রক্রিয়াটির পিআইডি পান। সাধারণত ps -C loop.shযথেষ্ট ভাল, তবে এটি আমার ক্ষেত্রে ছাপা হয়।

এখন আমরা অন্য টার্মিনালে স্যুইচ করতে পারি (বা press Z এবং একই টার্মিনালে টিপুন)। এখন gdbএই প্রক্রিয়া সংযুক্ত করা উচিত।

$ gdb -p <PID>

এটি স্ক্রিপ্টটি থামায় (যদি চলমান)। তার রাষ্ট্র দ্বারা চেক করা যাবে ps -f <PID>, যেখানে STATক্ষেত্র 'টি +' (বা ^ জেড 'টি' ক্ষেত্রে), যার মানে (মানুষ PS (1))

    T Stopped, either by a job control signal or because it is being traced
    + is in the foreground process group

(gdb) call close(1)
$1 = 0

ক্লোজ (1) সাফল্যে শূন্য ফিরিয়ে দেয়।

(gdb) call open("loop.out", 01102, 0600)
$6 = 1

ওপেন (1) সফল হলে নতুন ফাইল বর্ণনাকারীকে দেয়।

এই খোলা সমান open(path, O_TRUNC|O_CREAT|O_RDWR, S_IRUSR|S_IWUSR)। পরিবর্তে O_RDWR O_WRONLYপ্রয়োগ করা যেতে পারে, তবে /usr/sbin/lsofসমস্ত স্ট্যান্ড * ফাইল হ্যান্ডলারের ( FDকলাম) জন্য 'ইউ' বলে , যা এটি O_RDWR

আমি /usr/incolve/bit/fcntl.h শিরোনাম ফাইলটিতে মানগুলি পরীক্ষা করেছি।

আউটপুট ফাইলটি যেমন খোলা যায় O_APPEND, তেমনিভাবে করা যায় nohup, তবে এটি man open(2)এনএফএসের সমস্যার কারণেও প্রস্তাবিত নয় ।

যদি আমরা -1 রিটার্ন মান হিসাবে পাই call perror("")তবে ত্রুটি বার্তাটি প্রিন্ট করে। আমাদের যদি p errnoএরনো দরকার হয় তবে জিডিবি কোমন্ড ব্যবহার করুন ।

এখন আমরা নতুন পুনঃনির্দেশিত ফাইলটি পরীক্ষা করতে পারি। /usr/sbin/lsof -p <PID>কপি করে প্রিন্ট:

loop.sh <PID> truey    1u   REG   0,26        0 15008411 /home/truey/loop.out

আমরা চাইলে আমরা স্ট্যাডারকে অন্য একটি ফাইলে পুনর্নির্দেশ করতে পারি, যদি আমরা আবার অন্য কোনও ফাইলের নাম ব্যবহার করতে call close(2)এবং চাই call open(...)

এখন সংযুক্তগুলি bashছেড়ে দিতে হবে এবং আমরা ছেড়ে দিতে পারি gdb:

(gdb) detach
Detaching from program: /bin/bash, process <PID>
(gdb) q

gdbঅন্য স্ক্রিনটি যদি অন্য টার্মিনাল থেকে বন্ধ করে দেওয়া হয় তবে এটি চলতে থাকবে। আমরা loop.sh এর টার্মিনালে ফিরে যেতে পারি। এখন এটি স্ক্রিনে কিছু না লিখে চলমান এবং ফাইলটিতে লেখার জন্য writing আমাদের এটি ব্যাকগ্রাউন্ডে রাখতে হবে। তাই টিপুন ^Z

^Z
[1]+  Stopped                 ./loop.sh

(এখন আমরা একই অবস্থায় রয়েছি যেন ^Zশুরুতে চাপা ছিল))

এখন আমরা কাজের স্থিতি পরীক্ষা করতে পারি:

$ ps -f 24522
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID><PPID>  0 11:16 pts/36   S      0:00 /bin/bash ./loop.sh
$ jobs
[1]+  Stopped                 ./loop.sh

সুতরাং প্রক্রিয়াটি পটভূমিতে চলমান এবং টার্মিনাল থেকে পৃথক হওয়া উচিত। jobsবর্গাকার বন্ধনীগুলিতে কমান্ডের আউটপুটে সংখ্যাটি ভিতরে কাজটি চিহ্নিত করে bashbashকাজের সংখ্যার আগে '%' সাইন প্রয়োগ করে আমরা নিম্নলিখিত বিল্ট ইন কমান্ডগুলিতে ব্যবহার করতে পারি :

$ bg %1
[1]+ ./loop.sh &
$ disown -h %1
$ ps -f <PID>
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID><PPID>  0 11:16 pts/36   S      0:00 /bin/bash ./loop.sh

এবং এখন আমরা কলিং বাশ থেকে প্রস্থান করতে পারি। প্রক্রিয়াটি পটভূমিতে চলতে থাকে। যদি আমরা এর পিপিআইডিটি 1 (আরম্ভ (1) প্রক্রিয়া) হয়ে যায় এবং নিয়ন্ত্রণ টার্মিনালটি অজানা হয়ে যায়।

$ ps -f <PID>
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID>     1  0 11:16 ?        S      0:00 /bin/bash ./loop.sh
$ /usr/bin/lsof -p <PID>
...
loop.sh <PID> truey    0u   CHR 136,36                38 /dev/pts/36 (deleted)
loop.sh <PID> truey    1u   REG   0,26     1127 15008411 /home/truey/loop.out
loop.sh <PID> truey    2u   CHR 136,36                38 /dev/pts/36 (deleted)

মন্তব্য

GDB কাপড় একটি ফাইল তৈরি automatized যাবে (যেমন loop.gdb) কমান্ড এবং রান ধারণকারী gdb -q -x loop.gdb -p <PID>। আমার লুপ.gdb এর মতো দেখাচ্ছে:

call close(1)
call open("loop.out", 01102, 0600)
# call close(2)
# call open("loop.err", 01102, 0600)
detach
quit

অথবা এর পরিবর্তে যে কোনও একটি নিম্নলিখিত লাইনার ব্যবহার করতে পারেন:

gdb -q -ex 'call close(1)' -ex 'call open("loop.out", 01102, 0600)' -ex detach -ex quit -p <PID>

আমি আশা করি এটি সমাধানটির মোটামুটি সম্পূর্ণ বিবরণ।


খুব তথ্যবহুল সত্যই, এবং সম্ভবত সহজ ক্ষেত্রে ভাল কাজ করতে পারে। তবে সতর্ক হতে হবে, আরও জটিল ক্ষেত্রে মারাত্মকভাবে ব্যর্থ হতে পারে। আমার আজকের মধ্যে একটি ছিল: আমার প্রক্রিয়াটি আরও একটি প্রক্রিয়া তৈরি করেছিল যা আউটপুটটি করেছিল (সম্ভবত স্ট্যাডার থেকে), তবে তার মাস্টারের সাথে যোগাযোগের জন্য স্টাডাউটকে জড়িয়ে ধরেছিল। মাস্টারদের এফডি পুনঃনির্দেশ কার্যকর ছিল না কারণ সন্তানের উত্তরাধিকার সূত্রে উত্তরাধিকার সূত্রে প্রাপ্ত ছিল এবং শিশুদের স্টাডআউট বন্ধ করে দেওয়া সেই মাস্টারকে ব্যর্থ করেছিল যা পাইপের অন্য প্রান্তে অপেক্ষা করছিল। এক্স | এটি চেষ্টা করার আগে আপনার প্রক্রিয়াগুলি ভালভাবে জানুন।
সিমেস্টার - মনিকা

@ মাস্টার আপনি কোনও হ্যান্ডেল পুনঃনির্দেশিত হয়েছে কিনা তা পরীক্ষা করতে পারেন lsof(ফাইল হ্যান্ডেলের নামটি pipeপছন্দ নয় /dev/pts/1) বা দ্বারা ls -l /proc/<PID>/fd/<fd>(এটি হ্যান্ডেলের সিমলিংক দেখায়)। এছাড়াও উপ-প্রক্রিয়াগুলি এখনও আউটপুটগুলি পুনর্নির্দেশ করতে পারে না, যা কোনও ফাইলে পুনর্নির্দেশ করা উচিত।
সত্যই

7

নোহাপে চলমান প্রক্রিয়াটি প্রেরণ করতে ( http://en.wikedia.org/wiki/Nohup )

nohup -p pid , এটি আমার পক্ষে কাজ করে নি

তারপরে আমি নীচের কমান্ডগুলি চেষ্টা করেছিলাম এবং এটি খুব ভাল কাজ করেছে

  1. কিছু কিছু চালান, বলুন /usr/bin/python /vol/scripts/python_scripts/retention_all_properties.py 1

  2. Ctrl+ Zপ্রোগ্রামটি থামাতে (বিরতি দিতে) এবং শেলের কাছে ফিরে যেতে।

  3. bg পটভূমিতে এটি চালাতে।

  4. disown -h যাতে টার্মিনালটি বন্ধ হয়ে যায় তখন প্রক্রিয়াটি মারা যায় না।

  5. exitশেল থেকে বেরোনোর জন্য টাইপ করুন কারণ এখন অপারেশনটি তার নিজস্ব প্রক্রিয়ায় ব্যাকগ্রাউন্ডে চলবে তাই আপনি যেতে ভাল, সুতরাং এটি শেলের সাথে আবদ্ধ নয়।

এই প্রক্রিয়াটি দৌড়ানোর সমতুল্য nohup SOMECOMMAND


3

আমার এআইএক্স সিস্টেমে চেষ্টা করেছি

nohup -p  processid>

এটি ভাল কাজ করেছে। এটি টার্মিনাল উইন্ডোজগুলি বন্ধ করে দেওয়ার পরেও আমার প্রক্রিয়া চালিয়ে যায়। অতঃপর আমি ডিফল্ট শেল হিসেবে ksh আছে bgএবং disownকমান্ড কাজ করে নি।


2
  1. ctrl+ z - এটি চাকরিটি বিরতি দেবে (বাতিল করতে যাচ্ছে না!)
  2. bg - এটি কাজটিকে পটভূমিতে রাখবে এবং চলমান প্রক্রিয়াতে ফিরে আসবে
  3. disown -a - এটি কাজের সাথে সমস্ত সংযুক্তি কেটে ফেলবে (যাতে আপনি টার্মিনালটি বন্ধ করতে পারেন এবং এটি এখনও চলবে)

এই সহজ পদক্ষেপগুলি প্রক্রিয়া চালিয়ে যাওয়ার সময় আপনাকে টার্মিনালটি বন্ধ করতে দেয়।

এটি nohupচালিত হবে না (আপনার প্রশ্নের আমার বোঝার ভিত্তিতে, আপনার এটির দরকার নেই)।


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

-2

এটি tschell থাকাকালীন উবুন্টু লিনাক্সে আমার জন্য কাজ করেছিল।

  1. CtrlZ এটি বিরতি দিতে

  2. bg পটভূমিতে চালানো

  3. jobs তার কাজের নম্বর পেতে

  4. nohup %n যেখানে এন চাকরি সংখ্যা


2
না, এটি কাজ করে না:nohup: failed to run command '%1': No such file or directory
ডুনাটোটাটোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.