ডিমন হিসাবে শেল স্ক্রিপ্ট চালানোর জন্য "সঠিক" উপায় way


20

আমি একটি শেল স্ক্রিপ্ট লিখছি যা আমি ডেমমনটোস বা ডেমোনাইজের মতো বাহ্যিক সরঞ্জাম ব্যবহার না করে স্টার্টআপে ডেমন হিসাবে চালাতে চাই


লিনাক্স ডেমন রচনা হাওটো

মতে লিনাক্স ডেমন লিখন হাওটুর , একটি সঠিক ডেমন নিম্নলিখিত বৈশিষ্ট্য আছে:

  • অভিভাবক প্রক্রিয়া থেকে কাঁটাচামচ
  • বন্ধ সব ফাইল বর্ণনাকারী (অর্থাত, stdin, stdout, stderr)
  • লেখার জন্য লগগুলি খোলে (যদি কনফিগার করা থাকে)
  • অবিচ্ছিন্ন (সাধারণত ) স্থিতিশীল ডিরেক্টরিকে পরিবর্তিত করে/
  • ফাইল মোড মাস্ক পুনরায় সেট করুন (umask)
  • একটি অনন্য সেশন আইডি (এসআইডি) তৈরি করে

ডিমনাইজ পরিচিতি

Daemonize ভূমিকা এগিয়ে বলেছেন জানায় যে একটি টিপিক্যাল ডেমন এছাড়াও:

  • এর নিয়ন্ত্রণ টার্মিনাল থেকে বিচ্ছিন্ন করে (যদি সেখানে থাকে) এবং সমস্ত টার্মিনাল সিগন্যাল উপেক্ষা করে
  • এটি থেকে বিচ্ছিন্ন করা প্রক্রিয়া গ্রুপ
  • হ্যান্ডলগুলি SIGCLD

আমি কীভাবে এ , বা sh, এ সব করবdashbash শুধুমাত্র সাধারণ লিনাক্স সরঞ্জামগুলির সাথে স্ক্রিপ্ট?

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


দ্রষ্টব্য: আমি জানি যে স্ট্যাকএক্সচেঞ্জ নেটওয়ার্কে nohupবা এর ব্যবহারের সুপারিশ করা প্রচুর উত্তর রয়েছে তবে setsidএই পদ্ধতির কোনওটিই উপরের সমস্ত প্রয়োজনীয়তাকে মোকাবেলা করে না।


সম্পাদনা করুন: ডেমন (7) র manpage কিছু পয়েন্টার, যদিও পুরোনো ধাঁচের মধ্যে কিছু পার্থক্য হবে বলে মনে হচ্ছে দেয় SysVডেমন এবং নতুন systemdবেশী। যেহেতু বিভিন্ন ডিস্ট্রোসের সাথে সামঞ্জস্যতা গুরুত্বপূর্ণ, দয়া করে নিশ্চিত করুন যে উত্তরটি কোনও পার্থক্য পরিষ্কার করেছে।



1
"সঠিক" পথ আপনার নিজের শেল স্ক্রিপ্ট নৈপুণ্য, এটা তার নিজস্ব লগিং না করতে একটি ডেমন, ইত্যাদি চালু করার জন্য একটি পদ্ধতি প্রদান করা হয় ভালো জিনিস daemonএবং যারা অন্যান্য বিষয়ের চলমান জন্য নির্বিচারে যেমন চলমান জন্য কোন বিধান সঙ্গে শেল স্ক্রিপ্ট একটি ডিমন আপনি যেহেতু লেখক, সেই স্ক্রিপ্টটি কীভাবে রচিত হয় তার পুরো নিয়ন্ত্রণে, এটিকে তৈরি করুন যাতে এটি কেবলমাত্র সিস্টেমড ইউনিটফাইল বা আরসি.ডি স্ক্রিপ্ট থেকে চালু করা যায়। আপনি হয়নি উল্লেখ "উপযুক্ত"!
সমৃদ্ধ

উত্তর:


16

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

বলুন আপনার কাছে স্ক্রিপ্ট আছে /usr/bin/mydaemon

#!/bin/sh

while true; do
  date;
  sleep 60;
done

আপনি একটি ইউনিট তৈরি করুন /etc/systemd/system/mydaemon.service

[Unit]
Description=My daemon

[Service]
ExecStart=/usr/bin/mydaemon
Restart=on-failure

[Install]
WantedBy=multi-user.target 

আপনি চালানো রাক্ষস শুরু করতে

systemctl start mydaemon.service 

বুট শুরু করতে আপনি এটি সক্ষম করুন

systemctl enable mydaemon.service

যদি সিস্টেম ভিত্তিক সিস্টেমে বর্তমানে লিনাক্সের বেশিরভাগ বিতরণ হয় তবে এটি সত্যিকার অর্থে কোনও বাহ্যিক সরঞ্জাম নয়। নেতিবাচক হবে যে এটি যদিও সর্বত্র কাজ করবে না।


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

5
সিস্টেমড ব্যবহার করে এমন ডিস্ট্রসগুলির জন্য, systemd"বাহ্যিক সরঞ্জাম" এর চেয়ে বেশি আর কিছু নেই bash
আলেকজান্ডার

7

আমি সম্ভবত এখানে কিছু মিস করছি; ঠিক কেন nohupউপযুক্ত হবে না ? অবশ্যই এটি একা যথেষ্ট নয় , তবে পরিপূরক করা একেবারেই সহজ বলে মনে হচ্ছে।

#!/bin/bash

if [ "$1" = "DAEMON" ]; then
    # is this necessary? Add other signals at will (TTIN TTOU INT STOP TSTP)
    trap '' INT
    cd /tmp
    shift
    ### daemonized section ######
    for i in $( seq 1 10 ); do
        date
        sleep 5
    done
    #### end of daemonized section ####
    exit 0
fi

export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
umask 022
# You can add nice and ionice before nohup but they might not be installed
nohup setsid $0 DAEMON $* 2>/var/log/mydaemon.err >/var/log/mydaemon.log &

যতটা আমি দেখতে পারেন:

  • আউটপুট যথাযথভাবে পুনঃনির্দেশিত হয় (প্রয়োজনে / dev / নাল ব্যবহার করুন)
  • উমাস্ক উত্তরাধিকারসূত্রে প্রাপ্ত
  • stdin তবে মূল স্ক্রিপ্টের শেষে মারা যায়
  • ডেমন.শ স্ক্রিপ্টটি init(বা systemd) এর জন্য পুনরায় প্রেরণ করা হয়

আমার দৃ strong় অনুভূতি আছে আমি স্পষ্ট অনুপস্থিত। ডাউনভোট, তবে দয়া করে এটি আমাকে বলুন :-)


2
আমি খুব অনুরূপ কিছু পরামর্শ দিতে চলেছিলাম। আমি ব্যবহার nohupসঙ্গে &ও ইনপুট / আউটপুটের ফেরৎ বিভিন্ন অ আরম্ভ করার জন্য - Cডেমন ইউটিলিটি আপনার মোড়কে সম্ভবত অতিরিক্ত নিরাপত্তার সঙ্গে nohupএকটি নির্দেশে ভিতরে su -c "nohup ... &" -s /bin/bash systemUserএকটি অ-সুবিধাপ্রাপ্ত ব্যবহারকারী হিসাবে ডেমন চালানোর জন্য।
111 ---

4

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

# screen -dmS Session_Name  bash -c "while true; do date; sleep 60; done"

# screen -ls
There are screens on:
        8534.Session_Name       (04/04/2018 08:46:27 PM)        (Detached)

# screen -S Session_Name -X quit

2
screenশেল স্ক্রিপ্ট deamonize না। এটি কেবলমাত্র বিশিষ্ট টার্মিনালে চালিত করে এবং এই টার্মিনালটি (পিসি থেকে প্লাগ কীবোর্ডের মতো) বন্ধ করে সেশন ব্যতীত আলাদা করতে পারে। সুতরাং, বিচ্ছিন্ন টার্মিনালে চলমান প্রোগ্রামটি পটভূমিতে চলছে। অতএব - পটভূমিতে বিচ্ছিন্ন পাস প্রোগ্রাম।
ইউরিজ গনচরুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.