শেলটি বের হয়ে গেলে আমি মারা না যায় এমন একটি প্রক্রিয়া কীভাবে করব?


31

আমি যদি শেল থেকে ইম্যাক্স চালনা করি:

$ emacs foo &

এবং তারপরে সেই শেলটি মেরে ফেলুন, ইমাকস মারা যায়।

আমি কীভাবে একটি কমান্ড চালাতে পারি যাতে শেলটি মারা গেলে এটি মারা যায় না?

আমি নোহুপের উল্লেখ পেয়েছি, তবে এটি সাহায্য করবে বলে মনে হয় না:

$ nohup emacs foo &

শেল মারা গেলে এখনও ইমাসকে হত্যা করে।

উত্তর:


13

এটি কোনও এক্স অ্যাপ বা কনসোল অ্যাপ হিসাবে চলছে কিনা তা আপনি উল্লেখ করবেন না।

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

nohupকাজ করা উচিত, এটি কেন নয় তা নিশ্চিত নয়। শেলটি বন্ধ হয়ে গেলে, এটি SIGHUPতার প্রক্রিয়া গোষ্ঠীর সমস্ত প্রক্রিয়াতে প্রেরণ করে। nohup কমান্ডকে SIGHUP উপেক্ষা করার জন্য বলে।

আপনি সেটসিডও চেষ্টা করতে পারেন, যা প্রক্রিয়া গ্রুপ থেকে প্রক্রিয়াটি সংযোগ বিচ্ছিন্ন করে

alias emacs='setsid emacs'

বা disownপরে যোগ করুন&


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

41

সবচেয়ে নির্ভরযোগ্য পদ্ধতিটি প্রদর্শিত হচ্ছে:

(setsid emacs &)

এটি ( &)পটভূমিতে কাঁটাচামচ করতে এবং setsidনিয়ন্ত্রণকারী টিটিটি থেকে বিচ্ছিন্ন করতে ব্যবহার করে ।

আপনি এটি শেল ফাংশনে রাখতে পারেন:

fork() { (setsid "$@" &); }

fork emacs

সম্ভাবনাগুলি হ'ল:

  • disownBuiltin কমান্ড প্রয়োগ করুন:

    emacs &
    disown $!
    

    &কমান্ড বিভাজক হিসাবে কাজ করে এবং disownসর্বাধিক সাম্প্রতিক কাজটিতে ডিফল্ট হয়ে যায়, সুতরাং এটি সংক্ষিপ্ত করা যায়:

    emacs & disown
    
  • ডাবল fork():

    (emacs &)
    

    বন্ধনী ভিতরে কমান্ড ( ) পৃথক শেল প্রক্রিয়াতে চালিত হয়।

  • setsidরিচের পরামর্শ অনুসারে, সেরা পছন্দ হতে পারে, কারণ এটি একটি নতুন অধিবেশন তৈরি করে প্রক্রিয়াটির নিয়ন্ত্রণকারী টিটিওয়াইকে আনসেট করে :

    setsid emacs
    

    তবে এটি কিছুটা অনির্দেশ্যও রয়েছে - এটি কেবল fork()প্রসেস গ্রুপের নেতা হলে পটভূমি হবে (যা setsidকোনও shস্ক্রিপ্টে ব্যবহৃত হয় না , উদাহরণস্বরূপ; এই জাতীয় পরিস্থিতিতে এটি কেবলমাত্র Ctrl- এর প্রতিরোধী হয়ে উঠবে) সি)


গ্রেট! এই সব আমার জন্য কাজ। আমার অস্ত্রাগারে আরও কিছু সরঞ্জাম পেয়ে ভালো লাগল।
sligocki

হুম ... (exec emacs)কাজ করবে?
হ্যালো 71

@ হেলো: এটি ন্যায়বিচারের থেকে আলাদা হবে না (emacs)। সাবসেলকে যদি একটি কমান্ড দেওয়া হয় তবে execতা অন্তত ক্ষেত্রে অন্তর্ভুক্ত থাকে bashbash -c 'foo'বনাম একই প্রযোজ্য bash -c 'exec foo'। (তবে, নোট Emacs যে নিজেই টার্মিনাল থেকে বিচ্ছিন্ন করা যেতে পারে;।। Gvim উদাহরণস্বরূপ, এই আছে জানা আচরণ সঙ্গে একটি প্রোগ্রামের সাথে পরীক্ষা করাই ভালো)
grawity

দ্বৈত কাঁটাচামচ কৌশল শিখতে দুর্দান্ত; ধন্যবাদ!
ডেভ আব্রাহামস

আমার নিজের ইস্যুটি ঠিক করতে ট্রল করার সময় এটি পাওয়া গেছে। (সেটসড ইম্যাকস এবং) আমার পক্ষে কাজ করেছে। একটি ভাল লিখিত উত্তরের জন্য ধন্যবাদ।
পলব

5

শেল সেটিংস পরীক্ষা করে দেখুন। পরিবর্তে আপনি পর্দা চেষ্টা করতে পারেন nohup


আপনি screen -rযদি Ctrl-A Ctrl-Dলগ আউট করার আগে এটি সংযোগ বিচ্ছিন্ন করতে ব্যবহার করেন তবে স্ক্রিন আপনাকে পরে প্রক্রিয়াতে ফিরে আসতে দেয় ।
ব্রোহাম

এটি একটি খুব ভাল দিক। আমার বিপরীতে দরকার ছিল, অর্থাত্ একটি সাব্হেল কাঁটাচামচা করা এবং এর সমাপ্তির জন্য অপেক্ষা না করে অন্যান্য কাজগুলি চালিয়ে যাওয়া, তবে screen -d -m sh -c "{do stuff } exit"আরও বেশি অর্থবোধ করে।
নিমো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.