مقدمه ای بر  supervisor :)

گاهی وقت‌ها نیازه هستش تا ما برنامه یا اسکریپتی رو برای همیشه در سرور اجرا کنیم. یعنی بعد از بستن صفحه ترمینال برنامه متوقف نشه، یا اگر برنامه خطا داشته باشه و متوقف بشه یا سرور ریستارت بشه برنامه دوباره به صورت اتوماتیک اجرا بشه.برای این که با supervisor کار کنیم به یک اسکریپت یا برنامه نیاز داریم. من برای این کار یک برنامه کوچک با golang نوشتم که روی پورت ۵۰۰۰ اجرا میشه.package main import ( &quoterrors&quot &quotfmt&quot &quotlog&quot &quotnet/http&quot &quotos&quot ) func main() { http.HandleFunc(&quot/&quot, func(w http.ResponseWriter, r *http.Request) { fmt.Println(&quotNew Request!&quot) fmt.Println(&quot---------> &quot, os.Getenv(&quotTEST_ENV&quot)) fmt.Println(&quot=========> &quot, os.Getenv(&quotTEST_ENV_TWO&quot)) fmt.Fprintf(w, &quotHello world&quot) }) http.HandleFunc(&quot/error&quot, func(w http.ResponseWriter, r *http.Request) { log.Println(errors.New(&quotcan't divide by zero&quot)) fmt.Fprintf(w, &quotError :)&quot) }) fmt.Println(&quothttp://localhost:5000&quot) http.ListenAndServe(&quot:5000&quot, nil) }خب حالا باید بریم سراغ نصب supervisorبرای نصب supervisor نسبت به توزیع‌ خودتون یکی از دستورات زیر رو اجرا کنیدsudo apt install supervisor sudo pacman -Suy supervisor sudo dnf install supervisorبعد از نصب supervisor باید این سرویس رو با دستور زیر اجرا کنیم.sudo systemctl start supervisordو اگر بخواهیم بعد از از ریستارت سرور supervisor خودش، خود به خود اجرا بشه دستور زیر رو اجرا میکنیم.sudo systemctl enable supervisordتنظیم نحوه اجرای برنامه با supervisorاول باید محل ذخیره تنظیمات رو توی supervisor مشخص کنیم تا supervisor بتونه تنظیمات برنامه رو پیدا کنه برای این کار باید آخر فایل/etc/supervisor/supervisord.confویرایش کنیم و دستورات زیر رو بنویسم یا اصلاح کنیم:[include] files = /etc/supervisor/conf.d/*.confالان تمامی فایل هایی با پسوند .conf که در مسیر /etc/supervisor/conf.d رو supervisor میتونه پیدا کنه و در مسیر /etc/supervisor/conf.d/ فایلی به اسم test.conf ایجاد میکنیم و موارد زیر رو داخل فایل مینویسیم.[program:test] command=/home/majid/w/go/src/test-supervisor/server directory=/home/majid/w/go/src/test-supervisor autostart=true autorestart=true startretries=3 user=majid environment=TEST_ENV='test env one',TEST_ENV_TWO='test env two' stderr_logfile=/home/majid/w/go/src/test-supervisor/stderr.log stdout_logfile=/home/majid/w/go/src/test-supervisor/stdout.logمن محتوای کامل فایل رو بالا گذاشتم تا در اینجا توضحاتشون رو بدم.[program:test]: در این جا نام برنامه را تعریف کردیم که test هستش، توجه کنید که [program:-----] غیر قابل تغییر است و باید بنویسیم.command=/home/majid/w/go/src/test-supervisor/serverبا استفاده از این، دستور اجرایی یا نحوه اجرای برنامه رو مشخص میکنیم. و اگر نیاز باشد ارگومانی به برنامه پاس بدهیم باید اینجا بنویسیم.directory=/home/majid/w/go/src/test-supervisorمحل برنامه رو مشخص میکنیم و supervisor قبل از اجرای برنامه cd میکنه داخل این پوشه.autostart=trueوقتی مقادرش برابر true است یعنی بعد از اجرا supervisor (مثلا بعد از بوت شدن یا ریستارت سرور) برنامه به صورت اتوماتیک اجرا بشهautorestart=trueوقتی برنامه کرش کنه یا به هر دلیلی برنامه متوقف بشه supervisor از اول برنامه را اجرا کنه البته اگر مقدارش true باشد.startretries=3تعداد دفعاتی که بعد از متوقف شدن یا کرش کردن، برنامه را اجرا بشهstderr_logfile=/home/majid/w/go/src/test-supervisor/stderr.logمحل ذخیره سازی خروجی های برنامه مثل print وغیره. البته باید دقت کنید که supervisor نمی تواند پوشه ایجاد کند پس باید تمام پوشه های مسیر را بررسی کنید که وجود داشته باشد.stdout_logfile=/home/majid/w/go/src/test-supervisor/stdout.logخطا های برنامه (مثلا پیامی که در موقع کرش برنامه میده.) در این فایل ذخیره میشود. البته باید دقت کنید که supervisor نمی تواند پوشه ایجاد کند پس باید تمام پوشه های مسیر را بررسی کنید که وجود داشته باشد.user=majidاکانتی که میخواهید برنامه باهاش اجرا شودenvironment=TEST_ENV='test env one',TEST_ENV_TWO='test env two'متغیر های محیطی که برنامه در زمان اجرا نیاز دارد.بعد از ذخیره این فایل برای اینکه supervisor این تنظیمات را بخواند باید دستورات زیر را اجرا کنیم.Sudo supervisorctl reread # خواندن تنظیمات جدید Sudo supervisorcrl update # اعمال تنظیمات در supervisorحالا اگر بخواهیم ببینیم چه برنامه هایی توسط supervisor اجرا شده، دستور supervisorctl را اجرا میکنیم.و وارد قسمت کنترل supervisor میشویم. ما میتونیم با دستورstop testبرنامه را متوقف کنیم و با دستورstart testبرنامه رو اجرا کنیم. و اگر بخواهیم از این حالت بیرون بیاییم ctrl + c رو باید بزنیم. و همچنین بیرون از supervisorctl هم میتونیم برنامه را متوقف و اجرا کنیم.sudo supervisorctl stop test sudo supervisorctl start testبعد از اجرای برنامه localhost:5000 رو باز کنید. میبینیم که برنامه به خوبی در حال اجراست.