আমি নোহাপ সত্ত্বেও টার্মিনালটি বন্ধ করে দিলে ক্রোমিয়াম-ব্রাউজারকে কেন হত্যা করা হয়?


12

এই প্রশ্নটি পুরানো, এবং কেন আমি এখনও তা পরিষ্কার করতে পারি না।


2014 সালে আসল প্রশ্ন:

জিনোম টার্মিনাল ট্যাবে আমি দৌড়ে এসেছি

$ nohup chromium-browser &

তবে আমি যখন টার্মিনাল ট্যাবটি বন্ধ করি তখন chromium-browserবাইরে বের হয়। এটা কি nohupআটকাতে হবে না? গিলস বলেছেন:

Nohup এবং অস্বীকার উভয়ই SIGHUP দমন করতে বলা যেতে পারে তবে বিভিন্ন উপায়ে। নোহুপ প্রোগ্রামটিকে প্রাথমিকভাবে সিগন্যালটিকে উপেক্ষা করে তোলে (প্রোগ্রামটি এটি পরিবর্তন করতে পারে)। নোহুপ প্রোগ্রামটিকে নিয়ন্ত্রণকারী টার্মিনাল না রাখার ব্যবস্থা করার চেষ্টাও করে, যাতে টার্মিনালটি বন্ধ হয়ে গেলে কার্নেলের দ্বারা এটি SIGHUP প্রেরণ করা যায় না। অস্বীকার খোলকের সম্পূর্ণ অভ্যন্তরীণ; এটি শেলটি সমাপ্ত হলে SIGHUP প্রেরণ না করার কারণ করে।

তাই কি ক্রোমিয়াম-ব্রাউজার SIGHUP এড়িয়ে যাবে না?

আমি এটি অন্যান্য এক্সিকিউটেবলগুলিতেও দেখতে পাচ্ছি, যেমন, এবং ইমাকস (জিইউআই মোড)। তবে জাইজে নয়।

প্রশ্নটি পোস্ট করার সময় এটি 32-বিট উবুন্টুতে 12.04-এ চলছে।


২০১৫ সালে আপডেট,

এখন আমি ইনস্টল করার google-chromeপরিবর্তে উবুন্টু 14.04 চালাচ্ছি chromium-browser। ক্রোমিয়াম-ব্রাউজারে একই ঘটনা ঘটেছিল এখন গুগল-ক্রোমেও ঘটে। nohup google-chrome 2>/dev/null &টার্মিনাল ট্যাবটি বন্ধ হয়ে গেলে এটি বন্ধ হতে বাঁচায় না। /usr/bin/google-chromeবাশ স্ক্রিপ্টের লিঙ্ক /opt/google/chrome/google-chromenohupবাশ স্ক্রিপ্টে প্রয়োগ করা কেন কাজ করে না? কীভাবে আমরা এটিকে বাশ স্ক্রিপ্টগুলিতে কাজ করতে পারি? পাইথন লিপি সম্পর্কে কি?


1
আপনার নিজের পরিবেশ সম্পর্কে আরও বলা উচিত। আমি আপনার পরীক্ষার কেস পুনরুত্পাদন করি না।
jlliagre

আপনি অন্য কোন এক্সিকিউটেবলের সাথে এটি দেখতে পাচ্ছেন? সাধারণ কিছু চেষ্টা করুন, উদাহরণস্বরূপ, পছন্দ করুন xeyes
ওয়ারেন ইয়ং

@ ওয়ারেন ইয়ং: ইম্যাক্স (জিইউআই)। তবে জাইজ কাজ করে।
টিম

উত্তর:


12

আপনি যখন কোনও জিনোম টার্মিনাল উইন্ডোটি বন্ধ করেন, তখন শেলটিতে এটি চালিত হয়ে একটি SIGHUP প্রেরণ করা হয়। শেলটি সাধারণত প্রতিটি প্রক্রিয়া গোষ্ঠীতে একটি সাইনআপ পাঠাবে যা এটি জানে যে এটি তৈরি করেছে - এমনকি এটিরও শুরু হয়েছিল nohup- এবং তারপরে প্রস্থান করতে হবে। শেলটি যদি থাকে তবে bashএটি ব্যবহারকারীকে চিহ্নিত করা যে কোনও প্রক্রিয়া গোষ্ঠীতে একটি SIGHUP প্রেরণ এড়িয়ে যাবে disown

কমান্ড চালানো nohupএটি SIGHUP এড়িয়ে চলেছে, তবে প্রক্রিয়া এটি পরিবর্তন করতে পারে। যখন কোনও প্রক্রিয়ার জন্য সাইনগআপের অবস্থানটি ডিফল্ট হয়, তারপরে যদি এটি একটি সাইনআপ গ্রহণ করে, প্রক্রিয়াটি সমাপ্ত হবে।

চলমান প্রক্রিয়াটির সিগন্যাল সেটিংস পরীক্ষা করার জন্য লিনাক্স কিছু সরঞ্জাম সরবরাহ করে।

ক্রোমিয়াম-ব্রাউজার শেল স্ক্রিপ্ট একটি execসংকলিত অ্যাপ্লিকেশনটি করে, তাই এর প্রক্রিয়া আইডিটি একই থাকে। সুতরাং এর সিগন্যাল সেটিংস দেখতে, আমি দৌড়ে গিয়ে সংকেতটি দেখতে দেখতে nohup chromium-browser &তাকালাম /proc/$!/status

SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180014003

সেগুলি হেক্স নম্বর। এটি দেখায় যে সাইনআপ ধরা পড়ে না এবং উপেক্ষা করা হয় না। কেবলমাত্র SIGPIPE (সিগিগনে ১৩ তম বিট) উপেক্ষা করা হবে। আমি নিম্নলিখিত এই আঁকা কোড :

// Setup signal-handling state: resanitize most signals, ignore SIGPIPE.
void SetupSignalHandlers() {
  // Sanitise our signal handling state. Signals that were ignored by our
  // parent will also be ignored by us. We also inherit our parent's sigmask.
  sigset_t empty_signal_set;
  CHECK(0 == sigemptyset(&empty_signal_set));
  CHECK(0 == sigprocmask(SIG_SETMASK, &empty_signal_set, NULL));

  struct sigaction sigact;
  memset(&sigact, 0, sizeof(sigact));
  sigact.sa_handler = SIG_DFL;
  static const int signals_to_reset[] =
      {SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV,
       SIGALRM, SIGTERM, SIGCHLD, SIGBUS, SIGTRAP};  // SIGPIPE is set below.
  for (unsigned i = 0; i < arraysize(signals_to_reset); i++) {
    CHECK(0 == sigaction(signals_to_reset[i], &sigact, NULL));
  }

  // Always ignore SIGPIPE.  We check the return value of write().
  CHECK(signal(SIGPIPE, SIG_IGN) != SIG_ERR);
}

মন্তব্য সত্ত্বেও, পিতামাতার দ্বারা উপেক্ষা করা সংকেতগুলি উপেক্ষা করা হচ্ছে না । একটি সিগআপ ক্রোমিয়ামকে মেরে ফেলবে।

@ Xx4h নির্দেশ করে যে কাজটি করা হচ্ছে তা করা: আপনার ব্যাশে disownকমান্ডটি ব্যবহার করুন যাতে ব্যাশটি প্রস্থান করতে হয়, তবে এটি chromium-browserপ্রসেস গ্রুপে সাইনগআপ প্রেরণ করে না । এটি করার জন্য আপনি একটি ফাংশন লিখতে পারেন:

mychromium () { /usr/bin/chromium-browser & disown $!; }

ধন্যবাদ। এখন আমি বুঝতে পেরেছি বেশিরভাগটি আপনি কী বোঝাতে চেয়েছিলেন। "যেহেতু স্ক্রিপ্টটি কখনও এই ফাঁদটিকে পুনরায় সেট করে না, তাই প্রকৃত ক্রোমিয়াম বাইনারিটিকে ডিফল্টে সেটআপের স্বভাবের সাথে ডাকা হয়" " "এই ফাঁদটি পুনরায় সেট করুন" দ্বারা, আপনি কি সিগআপের জন্য ফাঁদটি ডিফল্টরূপে ফিরে পরিবর্তন করতে চান, যা প্রক্রিয়াটি বন্ধ করে দেয়? আপনি কীভাবে "এই ফাঁদটি পুনরায় সেট করবেন"?
টিম

ওহ, "এই ফাঁদটি পুনরায় সেট করুন" এর অর্থ, "শেল স্ক্রিপ্ট এটির জন্য একটি হ্যান্ডলার সেট করার আগে এই সংকেতটির পরিস্থিতিটিকে ঠিক সেভাবে সেট করে"। যদি শেলটি করে trap "" 1, এটি শেলটিকে (এবং তার শিশুরা) SIGHUP এড়িয়ে যাবে। আমি এটা স্পষ্ট করে বলব।
মার্ক প্লটনিক

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


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

3

যদি chromium-browserভালো কিছু হয় google-chromeতাহলে আমি মনে করি সম্ভবত ইস্যু যে chromium-browser নয়chromium কিন্তু এর পরিবর্তে একটি শেল-মোড়কের যা পরে রাষ্ট্র সূচনা হয় execগুলি chromium

আমার google-chromeইনস্টলেশনটিতে বাইনারিটি আসলে অবস্থিত এবং ইন /opt/google/chromeর‌্যাপারটি /usr/binকেবল একটি শেল স্ক্রিপ্ট যা xdg-*বাইনারি যথাযথের সাথে নিজেকে প্রতিস্থাপনের পূর্বে ডিফল্ট এবং পরম পাথ এবং একইরকম অনেক পরিবেশ স্থাপন করে।

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

file /usr/bin/chromium-browserএটি শেল-স্ক্রিপ্ট কিনা তা যাচাই করার চেষ্টা করুন I যদি তা হয় তবে আপনার পক্ষে আরও ভাল অনুসারে এটি পুনরায় লেখার বিষয়টি বিবেচনা করুন।

আমি বলতে পারি যে কেবল google-chrome 2>/dev/null &করণ এটি আমার জন্য উন্মুক্ত রাখে, তবে আমি স্মরণ করতে পারি না যে এটি সম্ভবত স্ক্রিপ্টে করা পরিবর্তনগুলির ফলস্বরূপ - এটি এক বছর আগে শেষ হয়েছিল।


ধন্যবাদ। এর chromium-browserআগে যা ঘটেছিল একই ঘটনা google-chromeএখনও ঘটে । আমি chromium-browserইনস্টল না । nohup google-chrome 2>/dev/null &টার্মিনাল ট্যাবটি বন্ধ হয়ে গেলে এটি বন্ধ হতে বাঁচায় না। google-chromeএটি একটি বাশ স্ক্রিপ্ট /opt/google/chrome/google-chrome। নোশপ কেন ব্যাশ স্ক্রিপ্টে প্রয়োগ করে না? কীভাবে আমরা এটিকে বাশ স্ক্রিপ্টগুলিতে কাজ করতে পারি? পাইথন লিপি সম্পর্কে কি?
টিম

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

আপনি কি স্ক্রিপ্টে বলছেন সেখানে execসত্যিকারের chromeবাইনারি রয়েছে? আমি কীভাবে স্ক্রিপ্টটি সংশোধন করব? এখানে আমার/opt/google/chrome/google-chrome
টিম

@ টিম - হ্যাঁ - নীচে দেখুন? exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"... শীর্ষে $HEREমানটির জন্য সেট করা হয়েছে readlink $0 (এটির জন্য আপনার ইনস্টলেশন পথ google-chrome) তবে /opt/google/chrome/chromeএটি বাইনারি - যা স্ক্রিপ্ট নিজেকে প্রতিস্থাপন করে।
মাইকজার্ভ

@Tim: যতদূর কিভাবে যায় - আপনি অবশ্য ড্রপ করতে পারেন execসম্ভবত। আপনি ডাব্লু / একটি অতিরিক্ত পিড (এর অন্য 1000 এর বাইরে) এবং একটি অপেক্ষার শেল প্রক্রিয়া সরিয়ে ফেলতে পারবেন তবে আমি মনে করি এটি এর পরিমাণ। অন্যথায় আপনি সম্ভবত execডাব্লু / nohupসম্ভবত প্রতিস্থাপন করতে পারেন । এটি সর্বোপরি নির্ভর করে কী chromeসহ্য করবে - তবে এটির মতো কাজ করা উচিত।
মাইকসার্ভ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.