বাশ 'বিল্টিন এক্সিকিউটিভের ক্ষেত্রে কেস / ব্যবহারিক উদাহরণ ব্যবহার করুন


12

বাশ 'বিল্টিন এক্সিকিউটিভের ডকুমেন্টেশন থেকে এটি বিবেচনা করুন:

এক্সেক নতুন প্রক্রিয়া তৈরি না করে শেলটি প্রতিস্থাপন করে

দয়া করে একটি ব্যবহারের কেস / ব্যবহারিক উদাহরণ সরবরাহ করুন। আমি বুঝতে পারছি না এটি কীভাবে বোঝায়।

আমি googled এবং I / O পুনঃনির্দেশ সম্পর্কে প্রায় খুঁজে । আপনি আরও ভাল ব্যাখ্যা করতে পারেন?


উত্তর:


18

execশেল স্ক্রিপ্টগুলিতে প্রায়শই ব্যবহৃত হয় যা মূলত অন্যান্য বাইনারিগুলি শুরু করার জন্য মোড়ক হিসাবে কাজ করে। উদাহরণ স্বরূপ:

#!/bin/sh

if stuff;
    EXTRA_OPTIONS="-x -y -z"
else
    EXTRA_OPTIONS="-a foo"
fi

exec /usr/local/bin/the.real.binary $EXTRA_OPTIONS "$@"

যাতে মোড়কটি চালানো শেষ হওয়ার পরে, "আসল" বাইনারিটি গ্রহণ করে এবং প্রক্রিয়া সারণীতে সাময়িকভাবে একই স্লটটি দখল করা মোড়ক স্ক্রিপ্টের আর কোনও চিহ্ন খুঁজে পাওয়া যায় না। "আসল" বাইনারি হ'ল নাতি-নাতনীর পরিবর্তে যা কিছু চালু করা হয়েছিল তার সরাসরি সন্তান।

আপনি আপনার প্রশ্নে I / O পুনঃনির্দেশের কথাও উল্লেখ করেছেন। এটি একেবারে আলাদা ব্যবহারের ক্ষেত্রে execএবং শেলটি অন্য প্রক্রিয়াতে প্রতিস্থাপনের সাথে কিছুই করার থাকে না। যখন execকোন যুক্তি নেই, যেমন:

exec 3>>/tmp/logfile

তারপরে কমান্ড লাইনে I / O পুনর্নির্দেশগুলি বর্তমান শেল প্রক্রিয়াতে কার্যকর হয়, তবে বর্তমান শেল প্রক্রিয়া চলতে থাকে এবং স্ক্রিপ্টের পরবর্তী কমান্ডে চলে যায়।


1
আপনি বলতে পারেন যে দু'টি ক্ষেত্রেই এটি উভয়ের ক্ষেত্রে সম্পর্কিত, execশেলকে কোনও শিশু প্রক্রিয়াতে ক্রিয়া (কমান্ড কার্যকর করতে বা পুনর্নির্দেশ সম্পাদন করতে) না করতে বলা হয়, তবে একই প্রক্রিয়াতে।
স্টাফেন চেজেলাস

5

আমি execএকটি জাভা প্রোগ্রামে একটি প্রসেস আইডি (পিআইডি) পেতে শেল বিল্টিন ব্যবহার করেছি । জাভা অভ্যন্তর থেকে এখন পিআইডি পাওয়ার কোনও উপায় থাকতে পারে, কিন্তু বেশ কয়েক বছর আগেও ছিল না। কোনও প্রক্রিয়ার নিজস্ব পিআইডি হয়ে গেলে, /var/run/পরিচালনা প্রোগ্রামগুলিকে চলমান প্রক্রিয়াটির পিআইডি জানতে এবং দ্বিতীয় দৃষ্টান্তটি রোধ করার জন্য এটি একটি পিআইডি ফাইলের মধ্যে লিখতে পারে ( '.pid' প্রত্যয় সহ ফাইলের নাম সন্ধান করুন) এবং চলমান থেকে একই সার্ভার। এটি এমন কিছু কাজ করে:

exec java -cp=YourServer.jar StartClass -p $$

main()শ্রেণীর পদ্ধতিতে কোডটি StartClassআর্গুমেন্ট পার্সিং পরিচালনা করে এবং এটির নিজস্ব প্রক্রিয়া আইডি খুঁজে পেতে পারে।


2

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

while(true) fork();

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

exec /bin/kill -9 -1

(ধরে নিন আপনার সিস্টেমে / বিন / কিল এ কিল আছে (1)। "এক্সিকিউটি - যা কিল্ট -9 -1" সম্ভাব্যরূপে নিরাপদ This) এটি আপনার পক্ষে প্রতিটি প্রক্রিয়াতে সিগিলকে প্রেরণ করে।

(দ্রষ্টব্য: প্রসেসটি সর্বদা একটি নতুন লগইনকে তার শেলের জন্য একটি প্রসেস স্লট সীমাবদ্ধ না করে আপনার প্রবর্তন শেলটি থেকে লগ আউট করবেন না you আপনি যদি এটি করেন তবে এটি পরিষ্কার করা কিছুটা বেশি কঠিন হতে পারে I '90s এর শুরুর দিকে। নাহ।)


3
(1) আপনি যদি execআদেশটি এই পরিস্থিতিতে কার্যকর হবে তবে এই উত্তরটি কিছুটা ভাল হবে। (২) এই উত্তরটি কিছুটা প্রত্নতাত্ত্বিক; killকমান্ড মূলত এই উদ্বেগের কারণ বহু বছর ধরে ব্যাশ একটি builtin কমান্ড হয়েছে।
জি-ম্যান 'পুনর্বহাল মনিকা' বলে

@ জি-ম্যান: আপনি বুঝতে পেরেছেন যে আপনার আইটেম (২) এই উত্তরটিকে ওপিতে একটি সুনির্দিষ্ট প্রতিক্রিয়া দেয়?
এরিক টাওয়ার

না, আমি বুঝতে পারি না। আমার এটা দয়া করে ব্যাখ্যা করুন।
জি-ম্যান

4
আমি তোমাকে অনুসরণ করছি না প্রশ্নটি সমস্ত ব্যাশ বিল্টিন কমান্ডের ব্যবহারিক উদাহরণ জিজ্ঞাসা করে না ; এটি উদাহরণগুলির জন্য জিজ্ঞাসা করে exec- এবং killএকটি বিল্টিন যে সত্যই execঅন্তর্নির্মিত সাথে কিছুই করার থাকে না ।
জি-ম্যান বলেছেন 4 '

1
আমি আপনার উত্তরটি আপনার আপডেটটি পড়েছি। (1) অনুমান কি? যদি প্রক্রিয়া সারণী পূর্ণ থাকে, তবে কমান্ড প্রতিস্থাপন (যেমন, `which kill`) কোনওভাবেই কাজ করবে না। (২) বিটিডাব্লু, $(…)ফর্মটি ফর্মের উপরে প্রস্তাবিত `…`। (3) তবে ডিরেক্টরিতে অনুমান করা বিপজ্জনক কিছু নেই। আপনি যদি দুর্ঘটনাক্রমে টাইপ করেন তবে আপনি exec /binn/killকেবল একটি ত্রুটি বার্তা পাবেন এবং আপনার শেলটি চলে যাবে না। (4) কিন্তু আপনি এমনকি ডিরেক্টরি সম্পর্কে চিন্তা করতে প্রয়োজন হবে না killহয়।  execব্যবহারসমূহ $PATH, শুধু স্বাভাবিক কমান্ড থাকে, তেমনি exec kill …(অভিমানী আপনি কাজ করে /binআপনার অনুসন্ধান পাথ)।
জি-ম্যান

1
  • এটি কোনও প্রক্রিয়ার পিআইডি জানতে প্রয়োজন ব্রুসের উদাহরণের সাথে মিল:

    (সেমিডিপিড = AS ব্যাশপিড; (ঘুম 300; কিল "$ সেমিডিপিড") & দীর্ঘকালীন কমান্ড সম্পাদন করুন )

    যা আপনি

    1. একটি সাবশেল (বাইরের (এবং )) শুরু করুন,
    2. সাবসেলের পিআইডি সন্ধান করুন। ( $$আপনাকে প্রধান শেলের পিআইডি দেবে))
    3. একটি সাব-সাব-শেল আলাদা করুন যা একটি সময়সীমা পেরিয়ে যাওয়ার পরে আপনার প্রক্রিয়াটিকে মেরে ফেলে এবং
    4. আপনি পদক্ষেপ 1 এ তৈরি করা সাব-শেল প্রক্রিয়াটিতে একটি কমান্ড চালান।

    এটি চলবে long-running-command, তবে কেবলমাত্র পূর্ব নির্ধারিত, সীমিত সময়ের জন্য। 

  • এটি কিছুটা বাজে, তবে আপনি যদি সিদ্ধান্ত নেন যে আপনার লগইন সেশনের বাকি অংশের জন্য আপনি রুট (বা অন্য কোনও ব্যবহারকারী) হতে চান তবে আপনি তা করতে পারেন exec su

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

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

    মন্তব্য:

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

নোট করুন যে বেশিরভাগ শেলগুলিতে অনুশীলনে, (a;b)ইতিমধ্যে (a;exec b)শেলগুলি সাব-শেলের সর্বশেষ কমান্ডের জন্য কাঁটাচামচকে অনুকূল করে তোলে as ব্যতিক্রমগুলি কেবল মনে হয় bashএবং mksh। ব্যবহার execএটির গ্যারান্টি দিতে সহায়তা করে।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.