আমি কীভাবে কোনও ব্যাশ স্ক্রিপ্ট থেকে কোনও প্রক্রিয়া আলাদা করতে পারি?


18

আমি ব্যাশ স্ক্রিপ্ট থেকে একটি প্রক্রিয়া আলাদা করার চেষ্টা করছি যাতে আমি স্ক্রিপ্ট থেকে প্রস্থান করার সময় SIGINT প্রক্রিয়াটিতে না পাঠানো হবে।

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

টার্মিনাল এ এটি দেখতে কিছু হবে:

$ openocd &    # run openocd demonized
$ disown $!    # disown last pid
$ gdb          # invoke GDB

এই ক্রমে টার্মিনালটিতে অনুরোধ করা হলে, জিডিবি থেকে ওপেনকডে সাইন ইন করা হয় না। তবে যদি একই অনুরোধটি বাশ স্ক্রিপ্টে থাকে তবে সাইন ইনটি পাস হয়ে যায়।

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।

PS এই সমস্যাটি ওএস এক্সে রয়েছে তবে আমি এমন সরঞ্জামগুলি ব্যবহার করার চেষ্টা করছি যা সমস্ত ইউনিক্স সরঞ্জামগুলিতেও বহনযোগ্য।


nohupপুরোপুরি সঠিক উত্তর নয়। আপনি কী চান তা আরও সুনির্দিষ্টভাবে দেখানোর জন্য আপনার কিছু সিউডোকোড বা উদাহরণ কোড যুক্ত করা উচিত।
ব্রুস এডিগার

1
আপনি কি কোনও সরঞ্জাম ব্যবহারের জন্য উন্মুক্ত screen?
এরিক রেনোফ

উত্তর:


16

ব্যাশ স্ক্রিপ্ট থেকে কোনও প্রক্রিয়া আলাদা করতে:

nohup ./process &

যদি আপনি আপনার বাশ স্ক্রিপ্টটি SIGINT(সিটিআরএল + সি) দিয়ে বন্ধ করেন, বা শেল SIGHUPউদাহরণস্বরূপ প্রেরণ থেকে প্রস্থান করে , প্রক্রিয়াটি বিরক্ত হবে না এবং সাধারণত সম্পাদন চালিয়ে যাবে। stdout& stderrএকটি লগ ফাইল থেকে আপনাকে পুনঃনির্দেশিত করা হবে: nohup.out

আপনি যদি টার্মিনালের আউটপুট দেখতে সক্ষম হয়ে একটি বিচ্ছিন্ন কমান্ড কার্যকর করতে চান তবে ব্যবহার করুন tail:

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./process &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &

nohupনেকাসারি কেন ? মধ্যে পার্থক্য কি nohup COMMAND &এবং COMMAND &যদি আপনার লক্ষ্য শুধুমাত্র পটভূমিতে নিম্নলিখিত কমান্ড টার্মিনালে মুক্ত করতে চান?
জেমস ওয়েয়ারজবা

@ জেমস ওয়েয়ারজবা তারতম্যের মধ্যে একটি হ'ল শেলটি বেরিয়ে যাওয়ার পরেও যদি আপনার চালনা চালিয়ে যেতে কমান্ডের প্রয়োজন হয় তবে নোহপ যাবার উপায়। ওয়েবে হাজার হাজার বিস্তৃত ব্যাখ্যা রয়েছে। যেমন stackoverflow.com/questions/15595374/...
মার্ক

11

আমার জন্য এটি অস্বীকার সঙ্গে পুরোপুরি সূক্ষ্ম কাজ করে

command & disown

4

আমি যে সমাধানটি পেয়েছি তাতে অ্যানন ইন্লোরিওনের লেখা 'ডিটাচ' নামক একটি প্রোগ্রাম জড়িত এবং তার ওয়েবসাইট থেকে ডাউনলোডযোগ্য

একবার সংকলিত হয়ে গেলে, এটি স্ক্রিপ্টে নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

$ ./detach -p debug.pid openocd <args> # detach openocd
$ gdb <args>                           # run gdb
$ kill -9 $(cat debug.pid)             # end openocd process
$ rm debug.pid                         # remove file containing process id

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


নিশ্চিত করতে পারে, detachবিস্ময়কর করে তোলে।
আঃ

2

একটি সহজ এবং বহনযোগ্য সমাধান:

echo "openocd" | at now #openocd starts now, but via the at daemon, not the current shell!
pid=$(ps -ef | grep "[o]penocd" | awk '{print $1}')  
echo "openocd is running with pid: $pid"
gdb

কিছু বহনযোগ্যতা সতর্কতা: psঅপশনগুলি ওএসের উপর নির্ভর করে! আপনি যদি এর পরিবর্তে একটি বৈকল্পিক ব্যবহার করতে পারে: { ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1atউপলভ্য হতে পারে না (অদ্ভুত, তবে এটি ঘটে ...)। $(...)একটি রিয়েললি পুরানো শেল প্রয়োজন, অন্যথায় ব্যাকটিক্স ব্যবহার করুন।


এটি বিপজ্জনক বলে মনে হচ্ছে, পিডের জন্য গ্রেপিং অপ্রত্যাশিত জিনিসগুলি করতে পারে যদি একই নামে একাধিক প্রক্রিয়া চলমান থাকে, বা এমনকি অন্য কোনও প্রক্রিয়াতে ওপেনোকড শব্দটি থাকে।
orion

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

অবশ্যই আপনার আমার (অতিমাত্রায় সাধারণ) উদাহরণে গ্রেপটি ডান কলামে (ডলার কলামে) সাধারণত ডান কলামে (column 8, সাধারণত) (কলামগুলি আপনার ওএস এবং সংস্করণ / পিএস এর বিকল্পগুলির উপর নির্ভর করে) প্রতিস্থাপন করা উচিত
অলিভিয়ার ডুলাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.