ssh থেকে সংযোগ বিচ্ছিন্ন করার সময় tmux অধিবেশন মারা গেছে


23

সংক্ষিপ্তসার : আমি যখন ssh থেকে সংযোগ বিচ্ছিন্ন করলাম তখন কেন আমার tmux সেশনটি মারা যায় figure

বিশদ :

আমি একটি আর্চ লিনাক্স সিস্টেমে tmux ইনস্টল করেছি। আমি যখন কোনও টিএমএক্স সেশন শুরু করি তখন আমি তা থেকে আলাদা করতে পারি এবং এসএস সেশনটি সক্রিয় থাকাকালীন আবার সংযুক্ত করতে পারি। তবে আমি যদি আমার ssh অধিবেশনটি শেষ করি তবে tmux সেশনটি মারা যায়।

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

আমি tmux সংস্করণ 1.9a চালাচ্ছি। যে সিস্টেমে সমস্যা রয়েছে (যেটির জন্য আমার কাছে রুট অ্যাক্সেস রয়েছে) এর লিনাক্স কার্নেল সংস্করণ রয়েছে 17.১.4.৪-১ এবং যে সিস্টেমটি সঠিকভাবে কাজ করে তার কার্নেল সংস্করণ রয়েছে 16.১.4.৪-১-আর্চ (এর মূলটি আমার নেই) পদ্ধতি). আমি সন্দেহ করি যে কার্নেল সংস্করণটি সমস্যার উত্স যদিও এটি কেবলমাত্র একটি পার্থক্য আমি লক্ষ্য করেছি।

আমি ভেবেছিলাম যে আমি যদি কেউ অনুরূপ সমস্যা দেখেছেন এবং কোনও সম্ভাব্য সমাধান জানেন কিনা তা জানতে জিজ্ঞাসা করব।

সমস্যার দিকে নিয়ে যাওয়ার সঠিক পদক্ষেপগুলি হ'ল:

  1. মেশিনে ssh
  2. tmuxtmux শুরু করতে চালান
  3. ctrl-B D বিচ্ছিন্ন করা (এই মুহুর্তে আমি আবার সংযুক্ত হতে পারে) tmux attach
  4. ssh অধিবেশন বন্ধ করুন (এই মুহুর্তে tmux সেশনটি মারা গেছে, আমি যখন অন্য টার্মিনালে রুট হিসাবে লগ ইন করব তখন আমি এটি পর্যবেক্ষণ করতে সক্ষম হয়েছি)
  5. ssh এর সাথে পুনরায় সংযোগ স্থাপন করুন এবং রান করুন tmux attachএবং আমি বার্তাটি no sessionsএবং চলমান tmux lsরিটার্ন পাই failed to connect to server: Connection refused। এটি বোঝা যায় কারণ পরিবেশন চলছে না। আমার কী অর্থ হয় না তা হ'ল আমি যখন ssh অধিবেশন থেকে সংযোগ বিচ্ছিন্ন করি তখন কেন এটি 4 ধাপে মারা যায়।

স্ট্রেস ডেটা:

একটি মন্তব্যের জবাবে আমি স্ট্রেস ব্যবহার করে দেখতে পেয়েছি যে সিস্টেমগুলি কী টিএমএক্স সার্ভার প্রক্রিয়া কল করে। দেখে মনে হচ্ছে যখন আমি আমার ssh সেশনটি (টাইপ করে exitবা এর মাধ্যমে ctrl-d) প্রস্থান করি যখন tmux প্রক্রিয়াটি নিহত হচ্ছে। স্ট্রেস আউটপুটটির চূড়ান্ত অংশের একটি স্নিপেট এখানে।

poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0)         = 1
+++ killed by SIGKILL +++

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


নিশ্চিত হতে, দয়া করে ধাপে ধাপে বর্ণনা করুন: আমি ধরে নিচ্ছি যে আপনি ssh করবেন, একটি tmux অধিবেশন শুরু করুন, অধিবেশন থেকে বিচ্ছিন্ন হয়ে, এবং shh বন্ধ করুন: যখন আপনি আবার ssh করবেন, আপনার tmix সেশনে পুনরায় যোগদানের কোনও উপায় নেই? অর্থাৎ অধিবেশন আর চলছে না?
অলিভিয়ার ডুলাক

@ অলিভারডুলাক হ্যাঁ আপনার অনুমানটি সঠিক is আমি এই বিবরণ অন্তর্ভুক্ত করতে আমার প্রশ্ন সম্পাদনা করেছি।
গ্যাব্রিয়েল দক্ষিণ

কিভাবে আপনি ssh অধিবেশন বন্ধ করবেন? এবং আপনি এসএমএসের পিডের সাথে টিএমউজের পিড এবং অন্যটি এসএসডি এর পিডের সাথে একটি স্ট্রেস সংযুক্ত করতে পারেন, আপনি ssh সংযোগটি বন্ধ করার সময় এটি কিছু পেয়েছে কিনা তা দেখতে (খুব ভার্জিন, কোনও ফাইলে পুনঃনির্দেশ)
অলিভিয়ার ডুলাক

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

ভার্জোজ লগিং সক্ষম সহ tmux শুরু করুন এবং দেখুন আপনি সংযোগ বিচ্ছিন্ন করার সময় লগতে কিছু মুদ্রিত হয়েছে কিনা তা দেখুন। এছাড়াও, tmux এর এবং বাইরে থাকা দূরবর্তী মেশিনের TERM কী?
জেসনওয়ারিয়ান

উত্তর:


16

তত্ত্ব

সিস্টেমেড সহ কয়েকটি ডিআইডি সিস্টেম সেবার অন্তর্ভুক্ত সমস্ত প্রক্রিয়া হ্রাস করার বৈশিষ্ট্য সরবরাহ করে। পরিষেবাটি সাধারণত একটি একক প্রক্রিয়া শুরু করে যা কাঁটাচামচ করে আরও প্রক্রিয়া তৈরি করে এবং সেই প্রক্রিয়াগুলি এটিও করতে পারে। এই জাতীয় সমস্ত প্রক্রিয়া সাধারণত পরিষেবাটির অংশ হিসাবে বিবেচিত হয়। সিস্টেমেডে এটি সিগ্রুপগুলি ব্যবহার করে করা হয় ।

সিস্টেমে ডিফল্টরূপে পরিষেবা বন্ধ হয়ে গেলে পরিষেবা সম্পর্কিত সমস্ত প্রক্রিয়া মারা যায়। এসএসএইচ সার্ভারটি অবশ্যই সেবার একটি অংশ। আপনি যখন সার্ভারের সাথে সংযুক্ত হন, এসএসএইচ সার্ভার সাধারণত কাঁটাচামচ করে এবং নতুন প্রক্রিয়াটি আপনার এসএসএইচ সেশন পরিচালনা করে। এসএসএইচ অধিবেশন প্রক্রিয়া বা এর বাচ্চাদের কাছ থেকে কাঁটাচামচ করে, আপনার স্ক্রিন বা টিএমউक्स সহ অন্যান্য সার্ভার সাইড প্রক্রিয়াগুলি শুরু হয় ।

কিলমোড এবং সকেট অ্যাক্টিভেশন

KillModeনির্দেশ ব্যবহার করে ডিফল্ট আচরণ পরিবর্তন করা যেতে পারে । প্রবাহ প্রকল্পটি এএফআইকে কোনও .serviceফাইল অন্তর্ভুক্ত করে না এবং তাই বিতরণ অনুসারে সেগুলি পৃথক হয়। আপনার সিস্টেমে সাধারণত এসএসএইচ সক্ষম করার দুটি উপায় রয়েছে। একটি হল ক্লাসিক ssh.serviceযা নেটওয়ার্কে দীর্ঘকাল ধরে চলমান এসএসএইচ ডেমন বজায় রাখে। অন্যটি সকেট অ্যাক্টিভেশন দ্বারা পরিচালিত হয় যা ssh.socketঘুরে ফিরে শুরু হয় sshd@.serviceযা কেবলমাত্র একক এসএসএইচ সেশনের জন্য চালিত হয়।

সলিউশন

যদি আপনার প্রক্রিয়াগুলি সেশন শেষে মারা যায়, আপনি সকেট অ্যাক্টিভেশন ব্যবহার করছেন এবং এসএসএইচ অধিবেশন প্রক্রিয়াটি বন্ধ হয়ে গেছে বলে লক্ষ্য করা গেলে এটি সিস্টেমড দ্বারা মারা যায়। সেক্ষেত্রে দুটি সমাধান রয়েছে। একটি হ'ল ssh.serviceপরিবর্তে ব্যবহার করে সকেট অ্যাক্টিভেশন ব্যবহার এড়ানো ssh.socket। অন্যান্য সেট করতে হয় KillMode=processServiceবিভাগে ssh@.service

KillMode=processসেটিং সর্বোত্তম সঙ্গে দরকারী হতে পারে ssh.serviceযেমন ssh সেশন প্রক্রিয়া বা হত্যা এড়াতে, পর্দা বা tmux প্রসেস সার্ভার থামানো বা পুনরায় আরম্ভ হয়।

ভবিষ্যতের নোট

এই উত্তরটি দৃশ্যত জনপ্রিয়তার একটি স্তর অর্জন করেছে। এটি ওপিতে কাজ করার সময় এটি হতে পারে যে সিস্টেমড-লগইন্ড বিকাশ বা কনফিগারেশনের কারণে এটি ভবিষ্যতে কারও পক্ষে কাজ করে না । আপনি যদি এই উত্তরের বর্ণনার থেকে ভিন্ন আচরণ অনুভব করেন তবে লগইন্ড সেশনে ডকুমেন্টেশন চেক করুন।


ডাউনভোটার থেকে কোনও নির্দিষ্ট প্রতিক্রিয়া বা কেবল ট্রলিং?
পাভেল Šিমেরদা

3
বিস্তারিত প্রতিক্রিয়া জন্য ধন্যবাদ। Sshd.service এ স্যুইচ করা সমস্যার সমাধান করেছে।
গ্যাব্রিয়েল দক্ষিন

initপরিবর্তে ব্যবহার করে কোনও সিস্টেমে আমি এই সমস্যাটি অনুভব করি systemd। তবে এটি যাইহোক কিছুটা আলাদা, আমার প্রশ্ন দেখুন
অঙ্কিত

5

আপনি কি এসএসএইচের জন্য সকেট অ্যাক্টিভেশন সহ সিস্টেমড ব্যবহার করেন?

যদি তা হয় তবে তা নিয়ে একটি জ্ঞাত সমস্যা আছে । সিস্টেমযুক্ত সমর্থকদের মতে, এটি আসলে একটি বৈশিষ্ট্য - সেশনটি সমাপ্ত হওয়ার পরে সিস্টেমড একটি অধিবেশন দ্বারা তৈরি সমস্ত প্রক্রিয়া মেরে ফেলে। (আমি দেখতে পাচ্ছি যে দরকারী হচ্ছে, তবে জিএনইউতে screen, বা tmuxক্ষেত্রে আপনি অবশ্যই তা চান না ☺ বা বেশিরভাগ ক্ষেত্রে যেখানে ব্যবহারকারীরা অবশ্যই ব্যাকগ্রাউন্ড প্রক্রিয়া চালাতে পারেন))

যদি তা হয় তবে এ থেকে স্যুইচ sshd.socketকরার চেষ্টা করুনsshd.service


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

2
@ পাভেলিমারদা হ্যাঁ, আমি মনে করি এটি অন্তর্নিহিত, তবে পোস্টটি এটি আরও স্পষ্ট করার জন্য সম্পাদনা করেছে।
মীরাবিলোস

3

উবুন্টু ১.0.০৪ (কেডিও নিওন) তে tmux এবং স্ক্রিন নিয়ে আমার একই সমস্যা ছিল। যখন ssh অধিবেশনটি সংযোগ বিচ্ছিন্ন হয়েছিল তখন স্ক্রিন / টিএমউक्स বন্ধ হয়ে গেল।

দীর্ঘ গল্প সংক্ষিপ্ত, systemd তাদের ডিফল্ট সেটিংটি হত্যার ঘটনায় পরিবর্তন করেছে = হ্যাঁ সুতরাং এসএসএস সেশন রেখে এর দ্বারা তৈরি প্রতিটি প্রক্রিয়া সমাপ্ত হবে।

সহজেই সমাধান (চেষ্টা করার কয়েক ঘন্টা পরে) এই কমান্ডটি ব্যবহার করে স্ক্রিন / টিএমউक्स চালান run

পর্দার জন্য

systemd-run --scope --user screen

Tmux জন্য

systemd-run --scope --user tmux

এটিকে সহজ করার জন্য আপনি একটি উপনাম তৈরি করতে পারেন

alias tmux= "systemd-run --scope --user tmux"


-bash: systemd-run: command not foundউপর Red Hat Enterprise Linux Server release 6.8 (Santiago)
অঙ্কিত

আমি যখন শিকড় না পেয়ে এই কাজ করে?
জারিত

1
আমি লক্ষ্য করেছি যে অবাঞ্ছিত tmux / স্ক্রিন হত্যার আচরণটি উবুন্টু 18.04 এলটিএসে ঘটে না, কেবল 16.04।
শেঠ

2

এই আরেকটি সমাধান, যা থেকে সরানোর প্রয়োজন হয় না sshd.socketকরতে sshd.service, শুরু হয় tmuxএকটি systemd হল সেবা [0] যেমন সার্ভার। এই পদ্ধতিতে, tmuxসার্ভারটি ইতিমধ্যে চালু রয়েছে যখন আপনি এসএসএইচ-র tmuxকমান্ডের পরিবর্তে সার্ভারের মধ্যে এসএসএইচ হ'ল , এভাবে হত্যা করা হবে না।

[0] https://wiki.archlinux.org/index.php/tmux# অটোস্টার্ট_উইথ_সিস্টেমড


আমি যখন শিকড় না পেয়ে এই কাজ করে?
জারিত

হ্যাঁ, এটি একটি কার্যকর সমাধান। তবে আপনি এখনও এসএসএইচ অধিবেশন থেকে এসএসএইচ পরিষেবা পুনরায় চালু করে মামলাটি সমাধান করতে চান। :)
পাভেল আইমারদা

বলছি, আপনি OpenRC ব্যবহার ক্ষেত্রে, আমি একটি তৈরি initscript tmux যে সেবা ফাইল ArchWiki উল্লেখ হিসাবে একই নয়
Megver83

1

আইএমও, আমি খুঁজে পেয়েছি সেরা উত্তর কিলিং tmux সেশন থেকে প্রিভেন্ট লগঅফ এ দেওয়া হয়েছে :

এই "বৈশিষ্ট্যটি" অস্তিত্ত্বকে করেনি systemdপূর্বে কিন্তু ডেভেলপারদের ডিফল্ট পরিবর্তন প্রভাব করার সিদ্ধান্ত নিয়েছে , একটি সেশন থেকে লগ আউট উপর সন্তানের প্রক্রিয়ার পরিসমাপ্তি জন্য সেটিং সক্রিয়।systemd

আপনি আপনার logind.conf( /etc/systemd/logind.conf) এ এই সেটিংটি ফিরিয়ে দিতে পারেন :

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