আমি শেল স্ক্রিপ্টের জন্য কীভাবে একটি পরিষেবা তৈরি করব যাতে আমি এটি ডেমনের মতো শুরু করতে এবং থামাতে পারি?


22

আমি সেন্টোস using ব্যবহার করছি যে আমার লক্ষ্য প্রতি পাঁচ সেকেন্ডের জন্য ক্রোন তৈরি করা তবে আমি যেমন গবেষণা করেছি আমরা ক্রোনটি কেবল এক মিনিটের জন্য ব্যবহার করতে পারি তাই আমি এখন যা করছি তা হচ্ছে আমি একটি শেল ফাইল তৈরি করেছি।
hit.sh

while sleep 5; do curl http://localhost/test.php; done

তবে আমি ডান ক্লিক করে এটি নিজেই হিট করেছি।

আমি যা চাই তা হ'ল সেই ফাইলটির জন্য একটি পরিষেবা তৈরি করা যাতে আমি এটিকে স্বয়ংক্রিয়ভাবে শুরু করতে এবং থামাতে পারি।

একটি পরিষেবা তৈরি করার জন্য আমি স্ক্রিপ্টটি পেয়েছি

#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

তবে আমি জানি না কী শুরুতে বা স্টপগুলিতে লিখতে start(){}হবে আমি হিট.শ এর একই বিষয়বস্তু রাখার চেষ্টা করেছি তবে এটি }স্টপ পদ্ধতিতে ত্রুটি দিয়েছে ।


/usr/bin/myscriptআপনি যখন এটি নিজে চালনা করেন তখন কি ঠিক কাজ করে? echo $?স্ক্রিপ্টটি একটি রান সম্পূর্ণ করার পরে আউটপুটটি কী হবে ? এটা কি 203?
আলেকজান্ডার

@ আলেকজান্ডার /usr/bin/myscript.shটার্মিনালের মাধ্যমে নির্বাহের ক্ষেত্রে সূক্ষ্মভাবে কাজ করে এবং echo$?আমাকে দিয়েছিল1
কোডগাসমার

কোনও সমস্যা না থাকলে স্ক্রিপ্টটিতে ত্রুটি কোড 0 ফিরিয়ে দেওয়া উচিত। ত্রুটি কোড 1 একটি ত্রুটি নির্দেশ করে।
আলেকজান্ডার

উত্তর:


30

আপনি যদি নিজের কোড নমুনাটি পুনরায় ব্যবহার করতে চান তবে এটির মতো দেখতে লাগতে পারে:

#!/bin/bash

case "$1" in 
start)
   /path/to/hit.sh &
   echo $!>/var/run/hit.pid
   ;;
stop)
   kill `cat /var/run/hit.pid`
   rm /var/run/hit.pid
   ;;
restart)
   $0 stop
   $0 start
   ;;
status)
   if [ -e /var/run/hit.pid ]; then
      echo hit.sh is running, pid=`cat /var/run/hit.pid`
   else
      echo hit.sh is NOT running
      exit 1
   fi
   ;;
*)
   echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

স্বভাবতই, আপনি যে স্ক্রিপ্টটি পরিষেবা হিসাবে কার্যকর করতে চান তা উদাহরণ হিসাবে যেতে হবে /usr/local/bin/hit.shএবং উপরের কোডটিতে যাওয়া উচিত /etc/init.d/hitservice

প্রতিটি রানলেভেলের জন্য যা এই পরিষেবাটি চলমান দরকার, আপনার একটি স্বতন্ত্র সিমলিংক তৈরি করতে হবে। উদাহরণস্বরূপ, নামের একটি সিমলিংক /etc/init.d/rc5.d/S99hitserviceরানলেভেল 5 এর জন্য পরিষেবাটি শুরু করবে অবশ্যই, আপনি এখনও এটিকে শুরু করে service hitservice start/ দ্বারা ম্যানুয়ালি থামিয়ে দিতে পারেনservice hitservice stop


ফাইলটির জন্য কি হিটসারওয়াইস.সার্ভিস এর মতো প্রত্যয় প্রয়োজন? এর পরে: ব্যাকআপের সার্ভিস শুরু করতে ব্যর্থ serv সার্ভিস: ইউনিট পাওয়া যায় নি। CentOS 7 এ কেন তাই উত্তর হিসাবে
এটির

@ কোড.IT নোট করুন যে ওপি একটি সিস্টেমভি স্ক্রিপ্ট চেয়েছিল, কোনও স্ক্রিপ্ট নয় systemd, সুতরাং কোনও প্রত্যয় প্রয়োজন হয় না। আপনার systemdঠিক পুরানো স্ক্রিপ্টগুলি সুনির্দিষ্টভাবে চালানো উচিত । আপনি চেষ্টা করেছেন systemctl enable hitservice?
দিমিত্রি গ্রিগরিয়েভ

@ দিমিত্রিগ্রিরিভ: এই স্ক্রিপ্টটি একাধিক ঘটনা প্রতিরোধ করতে পারে না বা তৈরি করা সমস্ত একাধিক প্রতিরোধ বন্ধ করে দেয় না, পিডফাইল কেবলমাত্র শেষ পিডের তৈরি প্রক্রিয়া সংরক্ষণ করে।
লুসিয়ানো

27

আমি বিশ্বাস করি CentOS 7 এবং তদূর্ধ্ব সিস্টেমেড ব্যবহার করে। যদি এটি আপনার সিস্টেমের ক্ষেত্রে হয় তবে নিম্নলিখিত ব্যবহার করে দেখুন:

  1. আপনি যে স্ক্রিপ্টটি চালু করতে চান তা স্থান দিন /usr/bin/myscript

  2. স্ক্রিপ্টটি দিয়ে সম্পাদনযোগ্য করতে ভুলবেন না chmod +x

  3. নিম্নলিখিত ফাইলটি তৈরি করুন:

/etc/systemd/system/my.service

[Unit]
Description=My Script

[Service]
Type=forking
ExecStart=/usr/bin/myscript

[Install]
WantedBy=multi-user.target
  1. সমস্ত সিস্টেমযুক্ত পরিষেবা ফাইলগুলি পুনরায় লোড করুন: systemctl daemon-reload

  2. এটি পরিষেবাটি চালু করে কাজ করছে কিনা তা পরীক্ষা করুন systemctl start my

বোনাস:

সিস্টেমেড সার্ভিস পরীক্ষার জন্য, দুটি উইন্ডো প্যান সহ একটি টিএমউक्स পরিবেশ চালু করা সম্ভব, যেখানে শীর্ষ উইন্ডোটি স্ক্রিপ্ট ( stdoutএবং stderr) থেকে আউটপুট নিরীক্ষণ করে এবং নীচের উইন্ডোটি পরিষেবাগুলি পুনরায় চালু করার জন্য ব্যবহার করা যেতে পারে। এটি tmuxইনস্টল করা প্রয়োজন , তারপরে কেবল:

tmux new-session \; select-layout even-horizontal \; split-window -v journalctl -o cat --since=@$(date +%s) -f -u my \; rotate-window \; set -g status-bg colour0 \; set -g status-fg colour9 \; attach

তারপরে পরিষেবাটি পুনরায় আরম্ভ করুন:

systemctl restart my

tmuxসঙ্গে ctrl-dএবং তারপর প্রস্থান করুন ctrl-c


জবাব দেওয়ার জন্য ধন্যবাদ আমি আপনাকে সমাধান করার চেষ্টা করেছি কিন্তু পরিষেবাটি শুরু হচ্ছে না আপনি আমার প্রশ্নের দিকে নজর দিতে পারেন আমি বিশদটি যুক্ত করেছি
কোডগ্যাসার

আমার মনে হয় আপনার স্ক্রিপ্টটি ব্যর্থ না হলে এটি কাজ করবে, তবে ত্রুটি কোড 0 প্রদান করে
আলেকজান্ডার

4
এখন আমি সিস্টেমড পছন্দ করি!
ডেনিসকলোডিন

1
স্ক্রিপ্টটি যে কোনও জায়গায় রাখা যেতে পারে, যতক্ষণ না সিস্টেমড পরিষেবাদি এটি অ্যাক্সেস করতে এবং চালিত করতে পারে।
আলেকজান্ডার

2
আমি সুপারিশ করব না Type=forkingপ্রশ্নকারীদের প্রয়োজন হওয়ার সম্ভাবনা রয়েছে Type=simpleতবে সাধারণভাবে কাঁটাচামচ করার প্রস্তাব দেওয়া হয় না: 0pointer.de/public/systemd-man/… । লোকেরা তাদের পুরানো আরআর স্ক্রিপ্টগুলি নিয়ে নিচ্ছে এবং এগুলি এগুলি মুড়িয়ে রাখছে systemdযাতে তাদের পরিষেবার সূচনা হয় systemd(init-script(service))। তবে systemdinit স্ক্রিপ্টগুলির জন্য প্রতিস্থাপন, সুতরাং আপনার সরাসরি পরিষেবাটি কল করা উচিত systemdযাতে এটির মতো দেখতে লাগে systemd(service)
সেন্টিমানে

3

এটি পরিষেবা হিসাবে আমার স্ক্রিপ্ট:

[Unit]
Description=To change In test buffer
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/test.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

2

এফপিএম একবার দেখুন। এটি এমন একটি সরঞ্জাম যা আপনার জন্য init স্ক্রিপ্ট তৈরি করবে। অনেক প্ল্যাটফর্মগুলিতে কাজ করে (সিস্টেমড, আপস্টার্ট, Ect ..)

https://github.com/jordansissel/fpm


0

দেখুন ব্যাশ সার্ভিস ম্যানেজার প্রকল্প: https://github.com/reduardo7/bash-service-manager

বাস্তবায়ন উদাহরণ

#!/usr/bin/env bash

export PID_FILE_PATH="/tmp/my-service.pid"
export LOG_FILE_PATH="/tmp/my-service.log"
export LOG_ERROR_FILE_PATH="/tmp/my-service.error.log"

. ./services.sh

run-script() {
  local action="$1" # Action

  while true; do
    echo "@@@ Running action '${action}'"
    echo foo
    echo bar >&2

    [ "$action" = "run" ] && return 0
    sleep 5
    [ "$action" = "debug" ] && exit 25
  done
}

before-start() {
  local action="$1" # Action

  echo "* Starting with $action"
}

after-finish() {
  local action="$1" # Action
  local serviceExitCode=$2 # Service exit code

  echo "* Finish with $action. Exit code: $serviceExitCode"
}

action="$1"
serviceName="Example Service"

serviceMenu "$action" "$serviceName" run-script "$workDir" before-start after-finish

ব্যবহারের উদাহরণ

$ ./example-service
# Actions: [start|stop|restart|status|run|debug|tail(-[log|error])]

$ ./example-service start
# Starting Example Service service...

$ ./example-service status
# Serive Example Service is runnig with PID 5599

$ ./example-service stop
# Stopping Example Service...

$ ./example-service status
# Service Example Service is not running
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.