এসএসএস মারা গেলে কিল প্রক্রিয়াটি এসএসএস দ্বারা তৈরি হয়েছিল


23

এটি এমন একটি প্রশ্ন যা বেশ কয়েকবার সম্বোধন করা হয়েছে, কেবল এখানেই নয়, স্ট্যাক এক্সচেঞ্জ নেটওয়ার্কের অন্যান্য সাইটেও (যেমন আমি যখন ssh নিজেই বাধা দিই তখন রিমোট প্রসেসটি মেরে ফেলতে কীভাবে এসএসএস তৈরি করব? )। যাইহোক, আমি কোনও সমাধান আমার জন্য কাজ করতে পারি না।

আমি ssh এর মাধ্যমে একটি কমান্ড চালাচ্ছি। যখনই আমি ssh থেকে প্রস্থান করি, আমি কমান্ডটিও মরতে চাই। এই কমান্ডটি কেটিসভার নামক একটি ডেমন যা আপনি সিটিআরএল-সি চাপ না দেওয়া পর্যন্ত অনির্দিষ্টকালের জন্য চলে।

আমি এটি নিম্নরূপে চালিত করছি: ssh -t compute-0-1 ktserverএবং, প্রকৃতপক্ষে, আমি যখন Ctrl-C টিপবো, প্রক্রিয়াটি সুদৃশ্যভাবে শেষ হয় এবং ssh অধিবেশন শেষ হয়।

তবে, যদি Ctrl-C চাপার পরিবর্তে আমি killকমান্ডটি ব্যবহার করে (যেমন উদাহরণস্বরূপ, SIGINT বা SIGHUP প্রেরণ) ssh প্রক্রিয়াটি মেরে ফেলি , ktserverপ্রক্রিয়াটি জীবিত থাকে।

কীভাবে হত্যা ktserverকরা sshহয় আমি কীভাবে সর্বদা মরতে পারি?

সম্পাদনা : যদি ktserverআমি এর পরিবর্তে পুরোপুরি আলাদা কিছু চালিত করি, যেমন gedit, সমস্ত কিছু কবজির মতো কাজ করে (যেমন সংযোগটি মারা যায় তখন জিডিট মারা যায়)। সুতরাং, প্রক্রিয়া নিজেই কিছু ভুল হতে পারে। উদাহরণস্বরূপ, আমি ভেবেছিলাম এটি সম্ভবত SIGHUP বা সাইন ইন উপেক্ষা করছে। যাইহোক, যখন আমি চালাচ্ছি kill -1 ktserverবা kill -2 ktserver, প্রক্রিয়াটি প্রত্যাশা অনুযায়ী মারা যায়।

সম্পাদনা 2 : মার্ক প্লটনিক যেমন উল্লেখ করেছেন, সমস্যাটি এই বিষয়টির সাথে সম্পর্কিত যে এসএসএস চ্যানেলে কোনও যোগাযোগ প্রচার হয় না। আমি ssh -t <host> readপরে ssh প্রক্রিয়া চালিয়ে এবং মেরে নিশ্চিত করেছি । readএখনও বেঁচে ছিল এবং লাথি মারছিল।


আপনি চেষ্টা করেছেন kill -9 ktserver?

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

লিনাক্সের সাথে আমার অভিজ্ঞতা হ'ল যদি দূরবর্তী কমান্ড মৃত tcp সংযোগে কোনও i / o না করে তবে এটি চলতে থাকবে। নেটওয়ার্ক সংক্রান্ত সমস্যার কারণে সংযোগটি মারা ssh example.com dd ...যাওয়ার কয়েক ঘন্টা পরেও আমার কাজ শেষ হয়েছে ssh। আপনি যদি ktserverকিছুক্ষণের মধ্যে একবার আউটপুট দেওয়ার বিকল্প নিতে পরিবর্তন করতে পারেন তবে এটি কার্যকর হতে পারে।
প্লটনিক

@ মার্কপ্লটনিক সত্যই, আমি readরিমোট কম্পিউটারে চালানোর চেষ্টা করেছি , এবং এসএসএস সংযোগটি হত্যা করার পরে, readমারা যায় নি। দুর্ভাগ্যক্রমে, আমি কে-সার্ভারকে কিছুতেই আউটপুটে পরিবর্তন করতে পারি না। তাহলে কোন সমাধান নেই?
জার্মানি

2
আমি ধরে নিই যে যখন ssh মারা যায় তখন আপনার শেলটিও মারা যায়। এটি শেষ হয়ে গেলে আপনি নিজের শেলটি একটি সংকেত -1 (SIGHUP) প্রেরণ করতে কনফিগার করতে পারেন। ( shopt -s huponexit)। এটি যদি আপনার পক্ষে কাজ করে তবে আপনি পরীক্ষা করতে পারেন?
হেনেস 0

উত্তর:


13

সাধারণত যখন ssh সংযোগটি মারা যায় তখন শেলটিও মারা যায়। আপনার শেলটি এর সমস্ত বাচ্চার কাছে শেষ হয়ে গেলে আপনি একটি সিগন্যাল -1 (SIGHUP) প্রেরণ করতে কনফিগার করতে পারেন।

বাশের জন্য আপনি বিল্টিন কমান্ড শপের মাধ্যমে এই বিকল্পটি কনফিগার করতে পারেন । ( shopt -s huponexit)।

Zsh জন্য আপনি চান ।setoptHUP


আমি ভেবেছিলাম এটি আমার বর্তমান সমস্যার উত্তর, তবে এটি কাজ করে না বলে মনে হয়। আমি চালাচ্ছি: ssh $ হোস্ট "scp লার্জফিল.ড্যাট $ অন্যান্যহোস্ট: / টিএমপি" & পিড = $! এবং তারপরে এই স্থানান্তরটি বন্ধ করার চেষ্টা করছি: শপট-হুপোনেক্সিট; মেরি পিড মেরে ফেলুন, তবে আমি যে এসএসএস শুরু করেছি তা মেরে ফেললে স্ক্যাপ থামবে না। কোন চিন্তা?
ডেভিড ডরিয়া

Scp কমান্ড শুরু করার আগে আপনি কি শেল অপশন সেট করে পরীক্ষা করতে পারবেন ? বা একটি শেল শুরু করে, শপট সেট করে এবং স্কিপ শুরু করে?
হেনেস

2
এটি আমার পক্ষে কাজ করে তবে আমি প্রথমে নিশ্চিত হয়েছি যে আমি ব্যবহার করছি ssh -t -t, ( -tদুবার বিজ্ঞপ্তি !) যা কেবলমাত্র পিটিআইয়ের চেয়ে tty বরাদ্দকে বাধ্য করে forces
নিকোলাস উ

13

আমি খুঁজে পেয়েছি যে এটি কার্যকরভাবে -t -tযুক্তি হিসাবে ব্যবহার করে ssh। আমাকে huponexitআরম্ভিক বা দূরবর্তী শেলটি সেট করতে হবে না।

আমি এটি নিম্নলিখিত হিসাবে পরীক্ষা করেছি:

কাজ করে না:

ssh user@remote sleep 100
^C

এটি ssh অধিবেশনটিকে হত্যা করেছে, তবে আমি দেখতে পাচ্ছি যে ঘুমের প্রক্রিয়াটি এখনও দূরবর্তী হোস্টে চলছে ( ps -ef | grep sleepএটি দেখায়)।

কাজ করে:

ssh -t -t user@remote sleep 100
^C

এটি ssh অধিবেশনটিকে হত্যা করে এবং দূরবর্তী ঘুম প্রক্রিয়াটিও হত্যা করা হয়েছিল। আমিও যাচাই করেছি যে সংকেত দূরবর্তী প্রক্রিয়া পাঠানো হয় যে SIGINTযদি আপনি ব্যবহার Control- C। আমি এটিও যাচাই করেছিলাম যে sshপ্রক্রিয়ায় প্রয়োগ করা SIGKILL (-9) এছাড়াও দূরবর্তী প্রক্রিয়াটিকে হত্যা করবে।

সম্পাদনা 1:

এটি সত্য ছিলsleep ... আরও জেদী দূরবর্তী প্রক্রিয়াগুলির জন্য, আমি দেখতে পেলাম যে ssh^ সি হ্যান্ডেল করে ^ সি সেই সাইন ইন। Ctrl- Cকাজ করেছে, কিন্তু kill -INT $pidকরিনি

আমার প্রকৃত অ্যাপ্লিকেশনটির জন্য কাজ করে শেষ পর্যন্ত আমি এখানে এসেছি (অন্যান্য উত্তরগুলি থেকে চুরি করা)।

ssh -t -t -i id_rsa user@mic0 "/bin/sh -O huponexit -c 'sleep 100'"

ডাবল কোট এবং একক উদ্ধৃতি নেস্টেড ব্যবহার নোট করুন। মনে রাখবেন যে আপনার দূরবর্তী প্রক্রিয়াটি প্রকৃতপক্ষে প্রস্থান করে সাইনআপে জবাব দেবে!


এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে, তবে এফওয়াইআই, এটি টার্মিনাল নিয়ন্ত্রণের অক্ষরগুলির মধ্যে রক্তপাতও ঘটায়, যা মজার আউটপুট তৈরি করতে পারে। সুতরাং, আমার ক্ষেত্রে সহজ কাজটি ছিল হ'ল কমান্ডগুলি মোড়ানো এবং তাদের আউটপুটটি পাইপ করা cat। উদাহরণস্বরূপ,ssh -ttq user@host '{ cmd; cmd; } | cat'
দ্রোজ

Ctrl-Cসবসময় সমতূল্য kill -INT $pid, উপর আমার উত্তর দেখুন unix.stackexchange.com/questions/377191/... উপর এবং অন্য stackoverflow.com/questions/8398845/... রক্তাক্ত বিস্তারিত জানার জন্য ;-)
thecarpy

@ থেরাপি - আপনার প্রথম উত্তরটি বলে যে সিটিআরএল -সি স্বাক্ষর করার অনুরূপ , এবং অন্য উত্তরটি বলেছে সাইন ইন ^Cপ্রেরণ করে । সুতরাং তারা সমতুল্য না হলে সঠিক পার্থক্য কি?
লাকাটা

1

যদি এসএসএস সিগন্যালগুলি প্রচার না করে তবে এটির কাছ থেকে আপনি কী প্রত্যাশা করবেন?

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


1
এটি প্রশ্নের উত্তর দেয় না। কোনও লেখকের সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন leave
অ্যান্থন

@ আনথন, এটি একটি ব্যাখ্যা। তবে কারও বক্তব্য এই নয় যে এটির সঠিক উত্তর হওয়া উচিত। নীচে আপনার মন্তব্যের জন্য ধন্যবাদ।
পোয়েজ

1
@ পয়েজ সম্ভবত ব্যাখ্যাটি মিটিয়ে দেবে যাতে এটি ওপি এবং অন্যদের কাজে লাগতে পারে।
জোসেফ আর।

@ জোসেফআর। ঠিক আছে, আপনার জন্য
পোয়েজ

1
যদি আমি বলি যে "এসএসএসডি সংযোগটি নষ্ট হয়ে যাওয়ার পরে কিল প্রক্রিয়াটি এসএসডি দ্বারা উদ্ভূত হয়েছে" এটি কী আপনার পক্ষে আরও ভাল লাগবে? আমি মনে করি না যে রিফ্রেসিং কোনওভাবেই আমার সমস্যার সমাধান করে।
জার্মানি

0

এখানে পোস্ট করা সমাধানটি আমার পক্ষে কাজ করে নি তবে যেহেতু এই প্রশ্নটি প্রথম এসেছিল যখন আমি অনুরূপ সমস্যার সমাধানের জন্য অনুসন্ধান করছিলাম এবং -t -tকৌশল সম্পর্কেও এখানে উল্লেখ করা হয়েছিল আমি অন্যদের চেষ্টা করার জন্য আমার পক্ষে কাজ করে এমন সমাধান পোস্ট করব।

ssh -t -t -o ControlMaster=auto -o ControlPath='~/test.ssh' your_remote_ip_goes_here "your_long_running_command" &
sleep 100
ssh -o ControlPath='~/test.ssh' -O exit your_remote_ip_goes_here

এইভাবে সংযোগটি বন্ধ হয়ে যাওয়ার পরে আমার দীর্ঘকালীন চলমান কমান্ডটি আর চলছিল না।

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