জিএনইউ স্ক্রিনটি একবার চালিত স্ক্রিপ্ট শেষ হওয়ার পরে সেশনটি শেষ হতে বাধা দিন


35

আমি জিএনইউ স্ক্রিনটিকে "ভার্চুয়াল" টার্মিনাল তৈরি করতে বাধ্য করার চেষ্টা করছি, এটি সংযুক্ত না করেই ভিতরে স্ক্রিপ্ট চালাও এবং স্ক্রিপ্ট শেষ হয়ে গেলে সেশনটি সমাপ্ত করবেন না।

আমি অনেকগুলি সমন্বয় চেষ্টা করেছি, সহ:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

অথবা

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

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

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

সুতরাং screenএকমাত্র বিকল্প বলে মনে হচ্ছে। তবে আমি বুঝতে পারি না, একবার চালানো কমান্ড বা স্ক্রিপ্ট শেষ হওয়ার পরে এটি কেন সেশনটি বন্ধ করে দেয়?

সম্পাদনা : আমি ইন্টারনেটে পাওয়া উদাহরণও চেষ্টা করেছি:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

অভাব নেই! এটি সংযুক্ত করার পরে ( screen -R name) আমি দেখতে পাচ্ছি যে মিডনাইট কমান্ডারকে মৃত্যুদন্ড কার্যকর করা হয়নি। যদিও উদাহরণ লেখক বলেছেন, এটা হবে।


আপনি যেভাবে ডাকছেন screen, আপনি কেবল একটি একক কমান্ড চালানোর জন্য একটি উইন্ডো তৈরি করেন। কমান্ডটি প্রস্থান করলে উইন্ডোটি বন্ধ হয়ে যায় এবং screenকিছুই করার থাকে না, তাই এটি প্রস্থান করে।
jw013

সুতরাং ... দুটি উইন্ডো খোলার কোনও উপায় আছে (কেবল কমান্ড লাইন ব্যবহার করে, কোনও কীবোর্ড সংমিশ্রণ নেই), একটি স্ক্রিপ্ট চালানো এবং দ্বিতীয়টি screenবন্ধ হওয়া থেকে রোধ করতে ? বিটিডাব্লু: আমি এখনও পিছনে ধারণা পেতে পারি না! যদি আমি কল করি তবে আমি screen -dmS nameএকটি বিচ্ছিন্ন উইন্ডো তৈরি করি, যা করার মতো কিছুই নেই। কিন্তু এটি স্বয়ংক্রিয়ভাবে বন্ধ হয় না! কিন্তু যখন আমি সেই বিচ্ছিন্ন স্ক্রিনে কোনও কিছু সম্পাদন করতে চাই, একবার কার্যকর হয়ে গেলে এটি শেষ হয়। কেন? আমি এখানে যুক্তি দেখছি না। উইন্ডো কিছুই করতে পারে না, কিন্তু উইন্ডো কিছু করতে পারে না এবং তারপরে কিছুই না করে?
ট্র্যাজার

2
যখন আপনি একটি কমান্ড উল্লেখ না করে একটি উইন্ডো শুরু, এটা হয় না "অসম্মতির"। "এটি কিছু করছে" এটি একটি ইন্টারেক্টিভ শেল চালাচ্ছে, যা আপনি ম্যানুয়ালি এড়িয়ে না যাওয়া পর্যন্ত প্রস্থান করে না।
jw013

শান্ত! একটি ব্যাখ্যা জন্য ধন্যবাদ! সুতরাং ... প্রশ্নে ফিরে ... ... কোনও বিচ্ছিন্ন স্ক্রিন / উইন্ডোতে কোনও কমান্ড চালানোর কোনও উপায় নেই এবং সেই অধিবেশনটি শেষ না করে একবার কমান্ডের প্রয়োগ শেষ হয়ে গেলে? এছাড়াও, দয়া করে আপডেট করা প্রশ্নটি একবার দেখুন। ধন্যবাদ.
ট্র্যাজার

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

উত্তর:


42

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

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm: বিচ্ছিন্ন মোডে পর্দা শুরু করে
  • -S: পরবর্তীতে আরও সহজ পুনরুদ্ধারের জন্য পর্দার জন্য সেশন নাম নির্ধারণ করে
  • sh -c '...': কেবল আপনার স্ক্রিপ্টটি চালানোর পরিবর্তে, যা সমাপ্ত হবে, sh -cএকাধিক কমান্ড চালানোর জন্য ব্যবহার করুন
  • exec bash: স্ক্রিপ্টটি সমাপ্ত হওয়ার পরে shউপরের দিক থেকে একটি ইন্টারেক্টিভ শেল ( bash) এ স্যুইচ হবে , যা কোনও বাহ্যিক সমাপ্ত না হওয়া অবধি কখনই প্রস্থান করা উচিত নয়। উদাহরণটি screenযতদিন bashবেঁচে থাকবে এটি ততক্ষণ উন্মুক্ত থাকবে ।

1
হুম ... মনে হয় আপনি আমার জীবন রক্ষাকারী! :] সিআরটিএল export IGNOREEOF=1+ ডি দিয়ে প্রামাণিক সমাপ্তি রোধ করতে আপনার সমাধানটি বাড়িয়ে দেওয়া আমাকে সঠিক সমাধান দেওয়া উচিত, আমি পুরো দীর্ঘ সন্ধ্যা খুঁজছিলাম। ধন্যবাদ! :]
ট্রেজার্ডার

এটি আজকের মতো ডেবিয়ানে কাজ করে না, -সি বিকল্প .স্ক্রিনসিআরসি ফাইলটি পড়ার যুক্তি ...
টোভাইন

@ টোভাইন ডিবান স্টেবল (হুইজি) এর উপর পুরোপুরি কাজ করে। আমি bash -cযদিও ব্যবহার ।
ট্রান্সলুসেন্টক্লাউড

@ ট্রান্সলুসেন্টক্লাউড আপনি কি "বশ-সি ..." পুরো কমান্ডটি উদ্ধৃতিতে আবদ্ধ করেছেন? শেষবার যখন আমি চেষ্টা করেছি (মন্তব্যটি লেখার ঠিক আগে) এটি আমার পক্ষে কাজ করে নি, কেন তা নিশ্চিত নয় ...
টোভাইন

: @ToVine এখানে আমার পুরো কমান্ডscreen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud

2

sh -cআমার রাস্পবেরি পাই 2 ডেবিয়ান 7.8 চালানোয় আমার ভাগ্য নেই । কিন্তু bash -cকাজটি করেছেন:

COMMAND:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"

এটি কি হতে পারে কারণ আপনি (রাস্পবেরি পাইতে) অন্য একটি শেল ব্যবহার করছেন? bashএবং shদুটি ভিন্ন শাঁস বলে মনে হয়। আমি মনে করি, এগুলিই তবে আমি ভুল হতে পারি, কারণ আমি লিনাক্সে একেবারে নবাগত।
ট্রেজার্ড

1
sh হ'ল ডিফল্ট ইউনিক্স-শেল, এটি রাস্পবিয়ান (ডিবিয়ান) এ অন্তর্ভুক্ত। Sh কমান্ডটিও কাজ করে, তবে sh -c পর্দার সাথে মিলিত হয় না।
স্কটিটি 86

@ Scotty86 আপনাকে ধন্যবাদ, লিনাক্স মিন্ট 19 (উবুন্টু 18.04) একই পর্যবেক্ষণ এবং পরিবর্তন sh -cকরার জন্য bash -cকৌতুক করেনি। আমি বুঝতে পারি না কেন shএবং উভয়ই bashইনস্টল করা আছে, তাই আমি এখনও এটির জন্য ঘুম হারাচ্ছি, তবে কমপক্ষে এটি কার্যকর হয়।
রেডসান্দ্রো

shসম্ভবত /bin/dashপরিবর্তে পয়েন্ট /bin/bash। ডেবিয়ান থেকে ডিফল্ট শেল সুইচড bashকরার dashকয়েক বছর আগে।
স্কাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.