বাশ-সাসপেন্ড? বিল্টিন কমান্ডের উদ্দেশ্য কী?


22

আমি টাইপ করে help suspendএই সংক্ষিপ্ত ব্যাখ্যাটি পেয়েছি:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

আমি এটি কীভাবে বুঝতে পারি: আমি টাইপ করি suspendএবং টার্মিনাল হিমশীতল হয়, এমনকি স্ট্রিং + সিও এটিকে জমাতে পারে না। কিন্তু যখন আমি অন্য টার্মিনালটি খুলি এবং হিমায়িতটির জন্য পিআইডি সন্ধান করি এবং টাইপ করে kill -SIGCONT PID-NRএকটি সিগনকন্ট সিগন্যাল হিমায়িত টার্মিনালে প্রেরণ করা হয় এবং এটি গড়িয়ে ফেলা হয়, যাতে এটি হিমায়িত হয়ে যায়।

তবে, টার্মিনাল স্থগিত করার আসল উদ্দেশ্য কী? প্রতিদিন অ্যাপ্লিকেশনগুলির জন্য এটি সাধারণত কী? যারা একে শেল বিল্টিন বানিয়েছেন তাদের মনে কী আছে?


2
স্থগিতের জন্য বাহ্যিক প্রোগ্রাম (হত্যা) চালানো এড়াতে হবে।
ইপোর সেরার

উত্তর:


23

আপনি যদি অন্য শেল থেকে শেল শুরু করেন তবে আপনি অভ্যন্তরীণটিকে স্থগিত করতে পারেন। ব্যবহার suকরার সময় এবং এক মুহুর্তের জন্য নিয়মিত ব্যবহারকারীর কাছে ফিরে যেতে চাইলে বলুন :

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(আপনি যদি এটি করেন তবে পটভূমিতে খোলা সুবিধাযুক্ত শেলটি ভুলে যাবেন না ...)

একইভাবে, আপনি যদি অন্য কোনও প্রোগ্রাম ( !যেমন কমান্ড less) থেকে কোনও শেলের কাছে পালাতে পারেন তবে আপনি এখনও শেলটি স্থগিত করতে পারেন। তবে আমি আশা করি না যে তারা যখন একটি সাব-প্রসেস চালু করে তখন অন্য অনেক প্রোগ্রাম এটিকে সুন্দরভাবে পরিচালনা করবে, যা পরে নিজেকে স্থগিত করে।


1
আমি কেবল দৌড়ানোর চেষ্টা করেছি vim, এবং :shএকটি সাব-শেল (বিশেষত, একটি zshসাব-শেল) পেতে একটি করেছি । চালানো suspendআমাকে আসল শেলটিতে পপ করে ফেলেছে (এটি সাবসেল এবং ভিআইএম উভয়ই স্থগিত করেছে)।
কেভিন

1
@Kevin, zshযে বুদ্ধিমতী মনে হয় চেয়ে bash, আমি উভয় থেকে উভয় পলায়নের চেষ্টা lessএবং vi(ডেবিয়ান এর vim.tiny): zshপিতা বা মাতা অ্যাপ্লিকেশন খুব বন্ধ, bashপুরো জিনিস নরক। bashথেকে bashকাজ যদিও।
ইল্কাচ্চু

1
আমি সচেতন ছিলাম না যে আমি যা sudo su একটি সাবস্কেল টাইপ করব তা শুরু হয়। আমি যখন প্রধান শেলটিতে সাসপেন্ড টাইপ করি তখন শেলটি হিমশীতল হয়ে যায় তবে আপনি কীভাবে দেখিয়েছিলেন, যখন আমি এটি সাবসেলের অভ্যন্তরে জমা করি তখন আমি স্বয়ংক্রিয়ভাবে মূল শেলটিতে ফিরে যাই।
হাঙ্গর্ট

25

এটি Ctrl+Zঅন্যান্য কমান্ডগুলিতে চাপ দেওয়ার সমতুল্য ।

এটি শেলটি স্থগিত করে এবং প্যারেন্ট শেলকে নিয়ন্ত্রণ দেয় বা যদি থাকে তবে প্রক্রিয়া করে।

উদাহরণ:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

বৈশিষ্ট্যটি সিএসএস থেকে আসে, বিএসডির শেল (যেখানে কাজের নিয়ন্ত্রণ আসে) 80 এর দশকের গোড়ার দিকে

এটিএন্ডটি-তে kshএটি একটি বিল্টিন ওরফে kill -s STOP $$( হ্যাঁ, উদ্ধৃতিগুলি ছাড়াই! )

আপনার ক্ষেত্রে bashসম্ভবত এটিই টার্মিনাল এমুলেটর দ্বারা সরাসরি শুরু হয়েছিল। এবং আপনার টার্মিনাল এমুলেটরটি প্রক্রিয়াটি স্থগিত হওয়ার আশা করেনি।

সেটাই bashছিল সেশন লিডার। যদি সেশন লিডার স্থগিত করা হয়, আমরা যদি পুরানো সময়ের টার্মিনালের দৃষ্টিভঙ্গি করি তবে ব্যবহারকারীর কাছে এটি পুনরায় চালু করার কোনও উপায় থাকবে না।

bashsuspendএটি লগইন শেল কিনা তা অস্বীকার করে ঠিকানাগুলি । তবে আপনার ক্ষেত্রে, আপনার টার্মিনাল এমুলেটর সম্ভবত bashলগইন মোডে শুরু হয় না , যাতে সেফগার্ডটি ঠিক না থাকে।

zshএবং mkshসমস্যা নেই কারণ তারা সিএস-এর পরিবর্তে (এবং কলারের প্রসেস গ্রুপে সিএস-এর মতো, এবং শেলের মূল প্রক্রিয়া গ্রুপকে , কেবল প্রক্রিয়া নয় ) SIGTSTPপ্রেরণ করে Ctrl+Zসিএসএসের মতো একটি (যেমন প্রেরিত একটি ) সিগন্যাল প্রেরণ করে )। এতিম প্রক্রিয়া গোষ্ঠীতে বিতরণ করার সময় এড়ানো হয় এবং নেতার দলটি যোগ্যতা অর্জন করে। ধারণাটি হ'ল SIGTSTP এর এমন কোনও কিছু স্থগিত করা উচিত যা কোনও ব্যবহারকারীর দ্বারা পুনরায় শুরুযোগ্য নয়।SIGSTOPmkshzsh$$SIGTSTP

ইন mkshবা yash, এক এছাড়াও ব্যবহার করতে পারেন suspendআছে একটি নিজেই স্থগিত subshell:

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

এটি এর সাথে কাজ করবে না zshযে কলারের পরিবর্তে মূল প্রক্রিয়া গোষ্ঠীতে SIGTSTP প্রেরণ করে। যে কোনও শেলটিতে killবিল্টিন রয়েছে, তার kill -s TSTP 0পরিবর্তে একটি সর্বদা ব্যবহার করতে পারে ।


4
আপনি স্থগিতের জন্য সাধারণ ব্যবহারটি উদ্ধৃত করতে পারেন: ব্যাশে (এবং সম্ভবত প্রচুর শাঁস): যখন আপনি একটি দীর্ঘ কমান্ড শুরু করেছিলেন, এবং তাতে বাধা দিতে চান না তবে হ্যাঁ আপনি পটভূমিতে এটি করেছেন (যেমন, আপনি চান command .... &তবে আপনি ভুলে গেছেন &এবং এখন ইচ্ছা করুন আপনি কমান্ডটি ব্যাহত না করে এটি যুক্ত করতে পারেন): আপনি: ctrl-zএবং তারপর টাইপ করতে পারেন: bgব্যাকগ্রাউন্ডে সর্বশেষ স্থগিত কাজটি আবার শুরু করতে। (বা bg %nটাস্ক নম্বর দিয়ে এটি করতে suspended স্থগিত বা চলমান কার্যগুলির তালিকা পেতে nব্যবহার করুন jobs)
অলিভিয়ার ডুলাক

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