উত্তর:
প্রক্রিয়াটিকে ব্যাকগ্রাউন্ডে প্রেরণ করতে ব্যাশের কাজ নিয়ন্ত্রণ ব্যবহার করুন :
bg
পটভূমিতে এটি চালাতে।disown -h [job-spec]
যেখানে [জব-স্পিপ] হ'ল জব নম্বর ( %1
প্রথম চলমান কাজের মতো; jobs
কমান্ড সহ আপনার নম্বরটি সন্ধান করুন ) যাতে টার্মিনাল বন্ধ হয়ে গেলে কাজটি মারা না যায়।disown -h
সম্ভবত আরও সঠিক উত্তরটি হ'ল: "অস্বীকার করা নোহুপের মতো আচরণ করুন (যেমন আপনার শেলটি প্রস্থান না করা পর্যন্ত কাজগুলি আপনার বর্তমান শেলের প্রসেস ট্রিতে থাকবে) এটি আপনাকে দেখতে দেয় এই শেলটি যে সমস্ত কাজ শুরু করেছিল তা " ([ কোয়ান্টর প্রিন্সিপাল / ইনভেস্ট / ইন্ডেক্স.এইচপি / ডকস / টিপস্যান্ডট্রিক্স / ইউনিক্স/… থেকে )
disown
, অস্বীকৃত একটি প্রক্রিয়াকে ডেমন করে তোলে যার অর্থ স্ট্যান্ডার্ড ইনপুট / আউটপুট / dev / নালকে পুনঃনির্দেশিত করা হয়। সুতরাং, আপনি যদি কোনও চাকুরী অস্বীকার করার পরিকল্পনা করেন তবে কোনও ফাইলটিতে লগইন করে এটি শুরু করা ভাল eg উদাহরণস্বরূপmy_job_command | tee my_job.log
মনে করুন যে কোনও কারণে Ctrl+ Zএছাড়াও কাজ করছে না, অন্য টার্মিনালে যান, প্রক্রিয়া আইডিটি (ব্যবহার করে ps
) সন্ধান করুন এবং চালান:
kill -SIGSTOP PID
kill -SIGCONT PID
SIGSTOP
প্রক্রিয়া স্থগিত SIGCONT
করবে এবং পটভূমিতে প্রক্রিয়াটি আবার শুরু করবে। সুতরাং এখন, আপনার উভয় টার্মিনাল বন্ধ করা আপনার প্রক্রিয়াটি থামবে না।
disown %1
এটি বন্ধ করার আগে প্রথম টার্মিনালে কেবল মনে রাখবেন ।
kwin
পরিণতির কথা চিন্তা না করে ক্রাশের পরে কনসোল থেকে শুরু করেছি )। সুতরাং আমি যদি কেভিনকে থামিয়ে দিই, সমস্ত কিছু হিমশীতল হয়ে যায় এবং আমার চালনার কোনও সম্ভাবনা থাকত না bg
!
একটি চলমান কাজ শেল থেকে পৃথক করার কমান্ড (= এটি disown
কোনও নোপআপ করে তোলে) এবং একটি বেসিক শেল-কমান্ড।
বাশ-ম্যানপেজ (ম্যান বাশ) থেকে:
অস্বীকার করুন [-আর] [-হ] [জবস্পেক ...]
বিকল্পগুলি ব্যতীত প্রতিটি জবস্পেক সক্রিয় কাজের সারণী থেকে সরানো হবে। যদি -h বিকল্পটি দেওয়া হয়, প্রতিটি জবস্পেকটি টেবিল থেকে সরিয়ে ফেলা হয় না, তবে চিহ্নিত করা হয় যাতে শেলটি যদি একটি SIGHUP পান তবে SIGHUP কাজটিতে প্রেরণ করা হয় না। যদি কোনও জবস্পেক উপস্থিত না থাকে এবং -আর বা -r বিকল্পটি সরবরাহ না করা হয় তবে বর্তমান কাজটি ব্যবহৃত হয়। যদি কোনও জবস্পেক সরবরাহ না করা হয়, -এ বিকল্পের অর্থ সমস্ত কাজ সরিয়ে বা চিহ্নিত করা; জবস্পেক আর্গুমেন্ট ছাড়াই -r বিকল্পটি চলমান কাজগুলিতে অপারেশনকে সীমাবদ্ধ করে। যদি কোনও জবস্পেক কোনও বৈধ কাজ নির্দিষ্ট না করে তবে ফেরতের মান 0 হয়।
তার মানে, এটি একটি সরল
disown -a
জব-টেবিল থেকে সমস্ত কাজ সরিয়ে ফেলবে এবং তাদের অহরহ করে তুলবে
disown -a
সমস্ত কাজ সরিয়ে দেয়। একটি সাধারণ disown
কেবল বর্তমান কাজ সরিয়ে দেয়। উত্তরের ম্যান পেজ যেমন বলে।
এগুলি উপরের উত্তরের উত্তর, আমি কেবল একটি স্পেসিফিকেশন যুক্ত করতে চেয়েছিলাম:
আপনি একটি কাজ disown
বা প্রক্রিয়া করতে পারবেন না , আপনি disown
একটি কাজ এবং এটি একটি গুরুত্বপূর্ণ পার্থক্য।
একটি কাজ এমন একটি প্রক্রিয়া যা শেলের সাথে সংযুক্ত একটি ধারণার ধারণা, তাই আপনাকে কাজটি পটভূমিতে ফেলে দিতে হবে (এটি স্থগিত করা হবে না) এবং তারপরে এটি অস্বীকার করতে হবে।
সমস্যা:
% jobs
[1] running java
[2] suspended vi
% disown %1
দেখুন http://www.quantprinciple.com/invest/index.php/docs/tipsandtricks/unix/jobcontrol/ ইউনিক্স চাকরির কন্ট্রোল আরো বিস্তারিত আলোচনার জন্য।
দুর্ভাগ্যক্রমে disown
বাশ নির্দিষ্ট এবং সমস্ত শেল উপলভ্য নয়।
ইউনিক্সের নির্দিষ্ট স্বাদের (যেমন এআইএক্স এবং সোলারিস) nohup
কমান্ডটিতে নিজেই একটি বিকল্প রয়েছে যা একটি চলমান প্রক্রিয়াতে প্রয়োগ করা যেতে পারে:
nohup -p pid
AIX
এবং জন্য Solaris
। "নোহুপের এআইএক্স এবং সোলারিস সংস্করণগুলিতে একটি -p বিকল্প রয়েছে যা ভবিষ্যতে সিএইচইউপি সংকেতগুলি উপেক্ষা করার জন্য একটি চলমান প্রক্রিয়াটি পরিবর্তন করে। উত্স
নোডের উত্তরটি সত্যিই দুর্দান্ত, তবে কীভাবে স্টডআউট এবং স্টাডার পুনঃনির্দেশিত হতে পারে তা এই প্রশ্নটি ছেড়ে দিয়েছে। আমি ইউনিক্স এবং লিনাক্সে একটি সমাধান পেয়েছি , তবে এটিও সম্পূর্ণ নয়। আমি এই দুটি সমাধান একত্রীকরণ করতে চাই। এটা এখানে:
আমার পরীক্ষার জন্য আমি 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
বর্গাকার বন্ধনীগুলিতে কমান্ডের আউটপুটে সংখ্যাটি ভিতরে কাজটি চিহ্নিত করে bash
। bash
কাজের সংখ্যার আগে '%' সাইন প্রয়োগ করে আমরা নিম্নলিখিত বিল্ট ইন কমান্ডগুলিতে ব্যবহার করতে পারি :
$ 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>
(এটি হ্যান্ডেলের সিমলিংক দেখায়)। এছাড়াও উপ-প্রক্রিয়াগুলি এখনও আউটপুটগুলি পুনর্নির্দেশ করতে পারে না, যা কোনও ফাইলে পুনর্নির্দেশ করা উচিত।
নোহাপে চলমান প্রক্রিয়াটি প্রেরণ করতে ( http://en.wikedia.org/wiki/Nohup )
nohup -p pid
, এটি আমার পক্ষে কাজ করে নি
তারপরে আমি নীচের কমান্ডগুলি চেষ্টা করেছিলাম এবং এটি খুব ভাল কাজ করেছে
কিছু কিছু চালান, বলুন /usr/bin/python /vol/scripts/python_scripts/retention_all_properties.py 1
।
Ctrl+ Zপ্রোগ্রামটি থামাতে (বিরতি দিতে) এবং শেলের কাছে ফিরে যেতে।
bg
পটভূমিতে এটি চালাতে।
disown -h
যাতে টার্মিনালটি বন্ধ হয়ে যায় তখন প্রক্রিয়াটি মারা যায় না।
exit
শেল থেকে বেরোনোর জন্য টাইপ করুন কারণ এখন অপারেশনটি তার নিজস্ব প্রক্রিয়ায় ব্যাকগ্রাউন্ডে চলবে তাই আপনি যেতে ভাল, সুতরাং এটি শেলের সাথে আবদ্ধ নয়।
এই প্রক্রিয়াটি দৌড়ানোর সমতুল্য nohup SOMECOMMAND
।
bg
- এটি কাজটিকে পটভূমিতে রাখবে এবং চলমান প্রক্রিয়াতে ফিরে আসবেdisown -a
- এটি কাজের সাথে সমস্ত সংযুক্তি কেটে ফেলবে (যাতে আপনি টার্মিনালটি বন্ধ করতে পারেন এবং এটি এখনও চলবে)এই সহজ পদক্ষেপগুলি প্রক্রিয়া চালিয়ে যাওয়ার সময় আপনাকে টার্মিনালটি বন্ধ করতে দেয়।
এটি nohup
চালিত হবে না (আপনার প্রশ্নের আমার বোঝার ভিত্তিতে, আপনার এটির দরকার নেই)।
এটি tschell থাকাকালীন উবুন্টু লিনাক্সে আমার জন্য কাজ করেছিল।
CtrlZ এটি বিরতি দিতে
bg
পটভূমিতে চালানো
jobs
তার কাজের নম্বর পেতে
nohup %n
যেখানে এন চাকরি সংখ্যা
nohup: failed to run command '%1': No such file or directory
yourExecutable &
আউটপুটগুলি স্ক্রিনে আসতে থাকে এবংCtrl+C
কোনও কিছু থামায় বলে মনে হয় না, কেবল অন্ধভাবে টাইপ করেdisown;
চাপুনEnter
এমনকি পর্দা আউটপুটগুলির সাথে স্ক্রোল করছে এবং আপনি কী দেখতে পাচ্ছেন না আপনি টাইপ করছেন প্রক্রিয়াটি অস্বীকার হয়ে যাবে এবং আপনি প্রক্রিয়াটি মারা যাওয়া ছাড়াই টার্মিনালটি বন্ধ করতে সক্ষম হবেন।