সিস্টেমযুক্ত পরিষেবাটি প্রস্থান না করে চলে runs


30

আমি জেকিলের জন্য আমার নিজস্ব পরিষেবা তৈরি করেছি এবং যখন আমি পরিষেবাটি শুরু করি তখন মনে হয় এটি ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে চালিত হয় না কারণ আমি বাধ্য হয়ে ctrl+ এর cবাইরে চলে যাই । - ওয়াচের কারণে এটি কেবল অগ্রভাগে অবস্থান করে। আমি কীভাবে এটির চারপাশে গিয়ে এটি তৈরি করব তা নিশ্চিত নই যাতে এটি পটভূমিতে চলে। কোন চিন্তা?

# /etc/systemd/system/jekyll-blog.service

[Unit]
Description=Start blog jekyll

[Service]
Type=forking
WorkingDirectory=/home/blog
ExecStart=/usr/local/bin/jekyll build --watch --incremental -s /home/blog -d /var/www/html/blog &
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
User=root
Group=root

[Install]
WantedBy=multi-user.target

সিস্টেমড আপনার প্রক্রিয়াটি শুরু করবে এবং আপনি যদি ব্যবহার করছেন তবে এটি অন্য প্রক্রিয়াটি কাঁটাচামচ করার আশা করবে Type=forking। তদ্ব্যতীত, এটি execStartশেল প্রসার হিসাবে চলবে না , যাতে &শেষে কখনই ব্যাকগ্রাউন্ড পতাকা হিসাবে বোঝা যায় না।
গ্রোচমল

আমার খারাপটি ছিল এবং আমি এটি পরীক্ষা করছিলাম। তাই টাইপ করা সহজ হওয়া উচিত?
madmanali93

2
আমি যদি ভুল না করি তবে জেকিল হ'ল রেল টাইপযুক্ত জিনিস, অর্থাত্ রুবিতে একটি ছোট ওয়েব সাইট server হ্যাঁ, Type=simpleউপযুক্ত হবে। এছাড়াও, আমি যে ধরণের অ্যাপ্লিকেশনটি রুট হিসাবে চালিত করব তা নয়, অন্তত কোনও ইন্টারনেট মুখোমুখি মেশিনে নেই (যা আপনার ক্ষেত্রে নাও হতে পারে)।
গ্রাচমাল

ধন্যবাদ হ্যাঁ সাধারণ কাজ। এছাড়াও এই কমান্ডটি অ্যাপাচি-র জন্য স্থির এইচটিএমএল তৈরি করে যাতে জেকিল সার্ভারে পরিবেশন না করে। আমি মনে করি এটি মূল হিসাবে চালানো ভাল ছিল উচিত। নিশ্চিত না যদিও এটি নিয়ে বিতর্ক হচ্ছে।
madmanali93

ওহ ওকে, তাই কি --incrementalতাই :)। হ্যাঁ, আমি ফাইলগুলিকে মূল হিসাবে পুনঃনির্মাণে কোনও সুরক্ষা সমস্যা দেখছি না। অবশ্যই, এই ফাইলগুলি ব্যবহারকারী সরবরাহিত নয় given
গ্রুচমাল

উত্তর:


54

সিস্টেমড বিশেষত নিম্নলিখিতগুলির মধ্যে একটি বিভিন্ন বিভিন্ন ধরণের পরিষেবা পরিচালনা করতে সক্ষম

  • simple - একটি দীর্ঘ-চলমান প্রক্রিয়া যা তার স্ব পটভূমি দেয় না এবং শেলের সাথে যুক্ত থাকে।
  • forking - একটি সাধারণ ডিমন যা কার্যকরভাবে নিজেকে ব্যাকগ্রাউন্ডিং করে, এটি চালানো প্রক্রিয়া থেকে নিজেকে আলাদা করে তোলে for
  • oneshot - একটি স্বল্প-কালীন প্রক্রিয়া যা থেকে বেরিয়ে আসা আশা করা যায়।
  • dbus - সহজ, তবে প্রক্রিয়া প্রারম্ভিককরণের বিজ্ঞপ্তিটি ডিবিএসের মাধ্যমে প্রেরণ করা হয়।
  • notify - সহজ, তবে প্রক্রিয়া প্রারম্ভিককরণের বিজ্ঞপ্তি inotify মাধ্যমে প্রেরণ করা হয়।
  • idle - সাধারণের মতো, তবে বাইনারিটি কাজটি প্রেরণের পরে শুরু হয়েছিল।

আপনার যদি আপনি বাছাই করেছেন Type=forkingযা প্রক্রিয়া নিজেই কাঁটাচামচ এবং শেষ পিতা বা মাতা প্রক্রিয়া, যার ফলে এটি একটি ইঙ্গিত যে প্রক্রিয়া সফলভাবে শুরু করেছে লাগে জন্য জন্য মানে systemd হল অপেক্ষা করছে। তবে, আপনার প্রক্রিয়া এটি করছে না - এটি অগ্রভাগে থেকে যায় এবং তাই systemctl startঅনির্দিষ্টকালের জন্য বা প্রক্রিয়া ক্র্যাশ না হওয়া অবধি ঝুলে থাকবে।

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

সুরক্ষা সম্পর্কিত একটি ছোট নোট:

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

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

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


0

@ মাইকেল ড্যাফিনের সমাধান ছাড়াও , আপনি নিম্নোক্ত উদাহরণে দেখানো হিসাবে এর ব্যবহার অর্জন করতে ডিমনাইজ সরঞ্জামটিও ব্যবহার করতে পারেন forking

একটি সামান্য শেল স্ক্রিপ্ট দেওয়া হয়েছে যা আমি ডিমনাইজ করতে চাই এবং যা আমি সিস্টেমডের উপর নিয়ন্ত্রণ করতে চাই, আমি এটিকে এটি সংরক্ষণ করেছিলাম /home/pi/testscript.sh:

#!/bin/bash

while true;
do
    sleep 1
    echo -n "."
done

আপনার যদি এটি এখনও না থেকে থাকে তবে ডিমনোমাইজ ইনস্টল করুন, এটির মতো:

sudo apt install daemonize

এখন ফাইল পরিষেবা সংজ্ঞা ফাইল তৈরি করুন:

sudo vi /etc/systemd/system/testomat.service
# It is not recommended to modify this file in-place, because it will
# be overwritten during package upgrades. If you want to add further
# options or overwrite existing ones then use
# $ systemctl edit testomat.service
# See "man systemd.service" for details.

# copied from https://github.com/bitcoin/bitcoin/blob/master/contrib/init/bitcoind.service and modified by Michael 

[Unit]
Description=Test service
After=network.target

[Service]
ExecStart=daemonize -p /run/testomat/testomat.pid -o /home/pi/testscript.log /home/pi/testscript.sh
TimeoutSec=1200

# Make sure the config directory is readable by the service user
PermissionsStartOnly=true

# Process management
####################
Type=forking
PIDFile=/run/testomat/testomat.pid
Restart=on-failure
GuessMainPID = true

# Directory creation and permissions
####################################

# Run as pi:pi
User=pi
Group=pi

# /run/testomat
RuntimeDirectory=testomat
RuntimeDirectoryMode=0710

# /var/lib/testomat
StateDirectory=testomat
StateDirectoryMode=0710

# Hardening measures
####################

# Provide a private /tmp and /var/tmp.
PrivateTmp=true

# Mount /usr, /boot/ and /etc read-only for the process.
ProtectSystem=full

# Allow access to /home, /root and /run/user
# Chosing "false" is actually no hardening, this is just to demonstrate the usage of a service. Well, I could have omitted it. True. :)
ProtectHome=false

# Disallow the process and all of its children to gain
# new privileges through execve().
NoNewPrivileges=true

# Use a new /dev namespace only populated with API pseudo devices
# such as /dev/null, /dev/zero and /dev/random.
PrivateDevices=true

# Deny the creation of writable and executable memory mappings.
MemoryDenyWriteExecute=true

[Install]
WantedBy=multi-user.target

সদ্য নির্মিত পরিষেবাটি সিস্টেমডে ঘোষণা করতে হবে:

systemctl daemon-reload

এখন আপনি পরিষেবা এবং স্ক্রিপ্ট কাঁটাচামচ শুরু করতে পারেন। যেমনটি প্রত্যাশা করা হয়েছিল, সার্ভিস শুরুটি তত্ক্ষণাত শেলটিতে ফিরে আসে। ফলাফল সুস্পষ্ট:

$ tail -f testscript.log 
.....................


এর পরিবর্তে daemonize+ Type=forkingব্যবহার করার Type=simpleএবং সিস্টেমডকে পরিষেবাটি শুরু করার বিষয়ে যত্ন নিতে কী সুবিধা ? Type=forkingকাঁটাচামচে লিখিত লিগ্যাসি প্রোগ্রামগুলিকে সমর্থন করার জন্য সিস্টেমডে এক ধরণের সামঞ্জস্যতা সেটিংস।
জোহান ম্যারেইন

আমি মনে করি এটি একটি সমতুল্য সমাধান; আমি কেবল ওপিকে একটি বিকল্প সমাধান সরবরাহ করতে এবং এই সরঞ্জামটি সম্পর্কে তাকে সচেতন করতে চেয়েছিলাম যা আমি ইতিমধ্যে /etc/init.d বার ব্যবহার করেছি যেহেতু প্রশ্নটি কীভাবে কোনও প্রক্রিয়াটিকে ডেমোনাইজ করতে হয় সে সম্পর্কেও কিছুটা নয়।
মাইকেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.