English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Supervisor هو أداة إدارة العمليات مبنية على Python، يمكن تشغيلها فقط على أنظمة Unix-Like، أي لا يمكن تشغيلها على Windows. نسخة Supervisor الرسمية حاليًا يمكن تشغيلها فقط على إصدارات Python 2.4 وما فوق، ولكن لا يمكن تشغيلها على Python 3، ومع ذلك، هناك نسخة نقلت إلى Python 3 supervisor-py3k.
في أي حال نحتاج إلى إدارة العمليات؟ هذا هو تنفيذ بعض البرامج التي يجب تشغيلها بشكل عملية حارسة، مثل مهمة خلفية، أكثر ما أستخدمه هو لتشغيل وإدارة برامج الويب المكتوبة باستخدام Tornado.
إضافة إلى ذلك، يمكن لـ Supervisor إدارة سجلات البرامج بشكل ودٍ، حيث يمكن إعادة توجيه السجلات إلى ملفات سجلات مخصصة، وكذلك تقسيم السجلات بناءً على حجم الملف.
يحتوي Supervisor على جزأين رئيسيين:
التثبيت
sudo pip install supervisor
إنشاء ملف الإعداد
echo_supervisord_conf > /etc/supervisord.conf
إذا واجهت مشكلة عدم الحصول على الصلاحيات، يمكنك استخدام هذا الأمر
sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"
شرح ملف الإعداد
للتعرف على كيفية إعداد العمليات التي يجب إدارتها، يمكنك فقط فتح ملف supervisord.conf، حيث يحتوي على تعليقات مفصلة.
افتح ملف الإعداد
vim /etc/supervisord.conf
الإعداد المبدئي للملف هو كما يلي، ولكن يجب الانتباه إلى فخ هنا، يتم تخزين supervisord.pid و supervisor.sock في مجلد /tmp، ولكن مجلد /tmp هو مجلد يحتوي على ملفات مؤقتة، ويتم حذف الملفات الموجودة فيه من قبل نظام Linux، وبدون هذه الملفات، لا يمكنك تنفيذ أوامر restart و stop من خلال supervisorctl، وستحصل فقط على خطأ بأن socket unix:///tmp/supervisor.sock غير موجود.
[unix_http_server] ;file=/tmp/supervisor.sock ; (the path to the socket file) ; قم بتعديلها إلى مجلد /var/run لتجنب حذفها بواسطة النظام file=/var/run/supervisor.sock ; (the path to the socket file) ;chmod=0700 ; socket file mode (default 0700) ;chown=nobody:nogroup ; مالك uid:gid لملف الجلسة ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server)) ;[inet_http_server] ; inet (TCP) server disabled by default ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface) ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server)) ... [supervisord] ;logfile=/tmp/supervisord.log ; (ملف السجلات الرئيسي؛افتراضي $CWD/supervisord.log) ; قم بتعديلها إلى مجلد /var/log لتجنب حذفها بواسطة النظام logfile=/var/log/supervisor/supervisord.log ; (ملف السجلات الرئيسي؛افتراضي $CWD/supervisord.log) logfile_maxbytes=50MB ; (حجم ملف السجلات الرئيسية قبل التبديل؛افتراضي 50MB) logfile_backups=10 ; (عدد نسخ التبديل الرئيسية لملف السجلات؛افتراضي 10) loglevel=info ; (مستوى السجلات;افتراضي info؛ الآخرين: debug,warn,trace) ;pidfile=/tmp/supervisord.pid ; (ملف pid لـ supervisord;افتراضي supervisord.pid) ; قم بتعديلها إلى مجلد /var/run لتجنب حذفها بواسطة النظام pidfile=/var/run/supervisord.pid ; (ملف pid لـ supervisord;افتراضي supervisord.pid) ... ;حدد مستخدم بدء supervisord، عادة لا يجب استخدامه مستخدم جذر لتشغيل supervisord، إلا إذا كنت متأكداً من ذلك ;user=chrism ; (الصنف الافتراضي هو المستخدم الحالي، مطلوب إذا كنت جذراً) ... [supervisorctl] ; يجب أن يتطابق مع الإعدادات في 'unix_http_server' ;serverurl=unix:///tmp/supervisor.sock ; استخدم عنوان URL unix:// لجلسة unix socket ; قم بتعديلها إلى مجلد /var/run لتجنب حذفها بواسطة النظام serverurl=unix:///var/run/supervisor.sock ; استخدم عنوان URL unix:// لجلسة unix socket ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=chris ; should be same as http_username if set ;password=123 ; should be same as http_password if set ...
بالتأكيد، عند بلوغ ملفات السجلات الخاصة بالعمليات 50MB، سيتم تفريغها، وسيتم الاحتفاظ بأقصى 10 ملف، ولكن يمكن أيضًا تخصيص هذه الإعدادات لكل عملية على حدة.
مشاكل الصلاحيات
بعد إعداد ملف الإعدادات، يجب إنشاء المجلدات المضافة في ملف الإعدادات. إذا تم تحديد مستخدم التشغيل user، لنفترض oxygen كمثال، يجب الانتباه إلى مشاكل الصلاحيات للملفات ذات الصلة، بما في ذلك ملفات السجلات، وإلا قد يظهر خطأ في عدم امتلاك الصلاحيات. على سبيل المثال، إذا تم تعيين مستخدم التشغيل oxygen، ثم بدء supervisord وظهر خطأ
خطأ: لا يمكن فتح خادم HTTP: تم الإبلاغ عن خطأ socket.error مع errno.EACCES (13)
هذا بسبب أن مجلد /var/run المذكور في ملف الإعدادات لم يتم منح المستخدم oxygen صلاحية الكتابة عليه. مجلد /var/run هو رابط إلى /run، لذا نعدل صلاحيات /run.
sudo chmod 777 /run
هذا بسيط جدًا ومتواضع، ولكن يمكن أيضًا النظر في نقل ملفات .sock،.pid المذكورة في ملف الإعدادات إلى مجلد آخر، وتأكد من امتلاك الأذونات اللازمة. عادةً، يمكننا تشغيل عملية supervisord كمسؤول، ثم تحديد المستخدم الذي نريد تشغيل العمليات من خلاله.
استخدام المتصفح لإدارة
supervisor يقدم أيضًا طريقة لإدارة العمليات عبر المتصفح، ويكفي فقط تعطيل بعض الأسطر أدناه.
;[inet_http_server] ; inet (TCP) server disabled by default ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface) ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server)) [supervisorctl] ... ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=chris ; should be same as http_username if set ;password=123 ; should be same as http_password if set
Use include
At the end of the configuration file, there is an [include] configuration item, just like Nginx, it can include all configuration files in a folder, so we can write the configuration for each process or a few related processes separately into a file.
[include] files = /etc/supervisord.d/*.ini
Process configuration example
Here is a simple example
; set the process name, it is required when managing processes with supervisorctl [program:your_program_name] command=python server.py --port=9000 ;numprocs=1 ; defaults to 1 ;process_name=%(program_name)s ; defaults to %(program_name)s, that is, x in [program:x] directory=/home/python/tornado_server ; before executing command, switch to the working directory user=oxygen ; تشغيل العملية باستخدام مستخدم oxygen ; automatically restart the program when it crashes, and the number of restarts is limited, the default is 3 times autorestart=true redirect_stderr=true ; إعادة توجيه مخرجات السجلات stdout_logfile = /var/log/supervisord/tornado_server.log loglevel=info
Set log level
loglevel specifies the level of the log, the logs output by Python's print statement will not be recorded in the log file, and you need to use Python's logging module to output logs with specified levels.
Multiple processes
According to the definition in the official documentation, a [program:x] actually represents a group of processes with the same features or of the same type, that is, a [program:x] can start multiple processes. The members of this group of processes are determined by the numprocs and process_name parameters. What does this mean? Let's look at this example.
; set the process name, it is required when managing processes with supervisorctl [program:foo] ; you can use python expressions here to pass different parameters to each process in the command command=python server.py --port=90%(process_num)02d directory=/home/python/tornado_server ; before executing command, switch to the working directory ; إذا كان numprocs ليس 1، يجب أن يحتوي تعبير process_name على process_num للتمييز بين العمليات المختلفة numprocs=2 process_name=%(program_name)s_%(process_num)02d; user=oxygen ; تشغيل العملية باستخدام مستخدم oxygen autorestart=true ; إعادة تشغيل البرنامج عند تحطمه redirect_stderr=true ; إعادة توجيه مخرجات السجلات stdout_logfile = /var/log/supervisord/tornado_server.log loglevel=info
هذا المثال سيقوم بتمكين اثنين من العمليات، process_name هما foo:foo_01 و foo:foo_02. من خلال هذا الأسلوب، يمكن استخدام ميزة [برنامج:x] لتمكين مجموعة من العمليات الشبيهة بشكل كبير.
سأقدم لكم الآن اثنين من المعدلات stopasgroup و killasgroup
; القيمة الافتراضية هي false، إذا تم ضبطها على true، عند استقبال عملية إشارة التوقف، سيتم إرسال الإشارة تلقائيًا إلى عملية الفرع الخاصة بها. إذا كان هذا المعدل يُضبط على true، فإن ذلك يعني أيضًا أن killasgroup هو true. على سبيل المثال، عند استخدام Flask في وضع التتبع، لن يرسل Flask إشارة التوقف التي يتلقاها إلى عملية الفرع الخاصة به، لذا يجب ضبط هذا المعدل.
stopasgroup=false ; إرسال إشارة التوقف إلى عملية UNIX ; القيمة الافتراضية هي false، إذا تم ضبطها على true، عند استقبال عملية إشارة القتل، سيتم إرسال الإشارة تلقائيًا إلى عملية الفرع الخاصة بها. إذا كان هذا البرنامج يستخدم multiprocessing في python، يمكن إيقاف فرق العمل الخاصة به تلقائيًا. killasgroup=false ; إرسال إشارة SIGKILL إلى مجموعة عملية UNIX (القيمة الافتراضية هي false)
مثال تفصيلي أكثر يمكن الاستعانة به، وثائق الرسمية هنا
;[برنامج:اسم البرنامج] ;command=/bin/cat ; البرنامج (الاستخدامات المطلقة يستخدم PATH، يمكن أن يأخذ معطيات) ;process_name=%(program_name)s ; تعبير اسم العملية (الافتراض: %(program_name)s) ;numprocs=1 ; عدد نسخ العملية التي يجب بدءها (الافتراض: 1) ;directory=/tmp ; مجلد إلى cwd قبل التنفيذ (الافتراض: لا cwd) ;umask=022 ; umask للعملية (الافتراض: None) ;priority=999 ; أولوية بدء نسبي (الافتراض: 999) ;autostart=true ; تبدأ عند بدء supervisord (الافتراض: true) ;autorestart=unexpected ; ما إذا وكيف يتم إعادة بدء (الافتراض: unexpected) ;startsecs=1 ; عدد الثواني التي يجب أن تبقى البرنامج يعمل (الافتراض: 1) ;startretries=3 ; أكبر عدد من محاولات بدء متسلسلة (الافتراض: 3) ;exitcodes=0,2 ; رموز الخروج المتوقعة للعملية (الافتراض: 0,2) ;stopsignal=QUIT ; إشارة تستخدم لتدمير العملية (الافتراض: TERM) ;stopwaitsecs=10 ; أكبر عدد من الثواني التي ينتظر فيها قبل إرسال SIGKILL (الافتراض: 10) ;stopasgroup=false ; ارسال إشارة التوقف إلى مجموعة عملية UNIX (الافتراض: لا) ;killasgroup=false ; SIGKILL the UNIX process group (def false) ;user=chrism ; setuid to this UNIX account to run the program ;redirect_stderr=true ; redirect proc stderr to stdout (default false) ;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO ;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) ;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10) ;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) ;stdout_events_enabled=false ; emit events on stdout writes (default false) ;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO ;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) ;stderr_logfile_backups=10 ; # of stderr logfile backups (default 10) ;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) ;stderr_events_enabled=false ; emit events on stderr writes (default false) ;environment=A="1",B="2" ; process environment additions (def no adds) ;serverurl=AUTO ; override serverurl computation (childutils)
将多个进程按组管理
Supervisor 同时还提供了另外一种进程组的管理方式,通过这种方式,可以使用 supervisorctl 命令来管理一组进程。跟 [program:x] 的进程组不同的是,这里的进程是一个个的 [program:x] 。
[group:thegroupname] programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions priority=999 ; the relative start priority (default 999)
当添加了上述配置后,progname1 和 progname2 的进程名就会变成 thegroupname:progname1 和 thegroupname:progname2 以后就要用这个名字来管理进程了,而不是之前的 progname1。
以后执行 supervisorctl stop thegroupname: 就能同时结束 progname1 和 progname2,执行 supervisorctl stop thegroupname:progname1 就能结束 progname1。supervisorctl 的命令我们稍后介绍。
启动 supervisord
执行 supervisord 命令,将会启动 supervisord 进程,同时我们在配置文件中设置的进程也会相应启动。
# 使用默认的配置文件 /etc/supervisord.conf supervisord # 明确指定配置文件 supervisord -c /etc/supervisord.conf # 使用 user 用户启动 supervisord supervisord -u user
لمزيد من الأ参数، يرجى الرجوعالمستندات
شرح أوضح لأوامر supervisorctl
# وقف عملية معينة،program_name هو x في [program:x] supervisorctl stop program_name # تشغيل عملية معينة supervisorctl start program_name # إعادة تشغيل عملية معينة supervisorctl restart program_name # انتهاء جميع العمليات التي تنتمي إلى مجموعة groupworker (start،restart بنفس الطريقة) supervisorctl stop groupworker: # انتهاء عملية groupworker:name1 (start،restart بنفس الطريقة) supervisorctl stop groupworker:name1 # وقف جميع العمليات، ملاحظة: لن يتم تحميل ملف التكوين الجديد باستخدام start أو restart أو stop supervisorctl stop all # قم بتحميل أحدث ملف التكوين، قم بوقف العمليات القديمة وتشغيل وإدارة جميع العمليات بناءً على التكوين الجديد supervisorctl reload # استخدم أحدث ملف التكوين، قم بتشغيل أو تحديث العمليات الجديدة أو التي تم تعديلها، لا تتأثر العمليات التي لم يتم تعديل تكوينها عند إعادة التشغيل supervisorctl update
النصيحة: سيتم إيقاف عملية باستخدام stop، باستخدام reload أو update لن يتم إعادة تشغيل تلقائيًا. يمكنك أيضًا الرجوع إلىهنا
إطلاق Supervisord تلقائيًا عند بدء النظام
لا يتم تثبيت Supervisord افتراضيًا كخدمة، إنه أيضًا عملية. قد قدمت الشركة سكربتًا يمكنه تثبيت Supervisord كخدمة، يمكنك الرجوع إلى هنا للاطلاع على سكربتات تثبيت الأنظمة المختلفة، ولكن لم أتمكن من تشغيل سكربت Ubuntu الذي قدمته الشركة.
يمكنك الاستعانة بطرق التثبيت المذكورة serverfault الإجابة المقدمة
مثلاً إذا كنت أستخدم نظام Ubuntu، يمكنني تثبيته بهذه الطريقة، هنا اخترت سكربتًا آخر
تنزيل السكربت sudo su - root -c "sudo curl https://gist.githubusercontent.com/howthebodyworks/176149/raw/d60b505a585dda836fadecca8f6b03884153196b/supervisord.sh > /etc/init.d/supervisord" # قم بضبط هذا السكربت ليكون قابلاً للتنفيذ sudo chmod +x /etc/init.d/supervisord # قم بضبطه للبدء التشغيل التلقائي sudo update-rc.d supervisord defaults # جرب، هل يعمل بشكل صحيح service supervisord stop service supervisord start
ملاحظة: يجب التحقق من أن هذا السكربت يتطابق مع إعداداتنا، مثل مسار ملف الإعدادات الافتراضي، مسار ملف PID، وما إلى ذلك، إذا كانت هناك اختلافات، يجب إجراء بعض التغييرات.
في الواقع، هناك طريقة بسيطة، لأن Linux يقوم بتنفيذ سكربتات /etc/rc.local عند بدء التشغيل، لذا يمكنك فقط إضافة الأمر التنفيذي هنا
# إذا كان Ubuntu، أضف المحتوى التالي /usr/local/bin/supervisord -c /etc/supervisord.conf # إذا كان CentOS، أضف المحتوى التالي /usr/bin/supervisord -c /etc/supervisord.conf
المحتوى المذكور أعلاه يجب أن يتم إضافته قبل الأمر exit، ويعتمادًا على أن PATH المتغير البيئي لم يتم تعيينه بشكل كامل عند تنفيذ سكربت rc.local، يجب استخدام المسار المطلق للأمر.
قبل إضافة، قم باختبار الأمر في النهاية أولاً لمعرفة ما إذا كان يمكن تنفيذه بشكل صحيح، إذا لم يتم العثور على supervisord، يمكنك استخدام الأمر التالي للعثور عليه
sudo find / -name supervisord
بيان: محتوى هذا المقال تم جمعه من الإنترنت، وله حقوق الملكية الأصلية للمالك، تم جمع المحتوى من قبل المستخدمين عبر الإنترنت بشكل متعاوني وتم تحميله بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا اكتشفت محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.