Բոտի աշխատեցումը ֆոնային ռեժիմում¶
Այս հոդվածում
Python-ի (կամ ցանկացած այլ) բոտը անընդհատ աշխատեցնելու, սխալների դեպքում ավտոմատ վերականգնելու և սերվերի վերագործարկումից հետո մեկնարկելու համար պարզապես python main.py հրամանը բավարար չէ։ Ձեզ անհրաժեշտ է ամբողջական ֆոնային ծառայություն։
Ստորև ներկայացված են երեք ապացուցված մեթոդներ՝ պարզ screen-ից մինչև արդյունաբերական մակարդակի systemd։ Ընտրեք՝ հիմնվելով ձեր պահանջների վրա։
Միջավայրի պատրաստում¶
-
Տեղադրեք բոտի կոդը, օրինակ՝
/home/user/botհասցեում. -
Ստեղծեք և ակտիվացրեք վիրտուալ միջավայր կախվածությունները մեկուսացնելու համար.
-
Ինստալացրեք կախվածությունները.
-
Ստուգեք ձեռքով մեկնարկը.
Նշում
Մի աշխատեցրեք բոտը root օգտատերով, եթե դա անհրաժեշտ չէ։ Ավելի լավ է ստեղծել նվիրված օգտատեր.
Մեթոդ 1. screen — արագ մեկնարկ (թեստավորման և զարգացման համար)¶
Առավելություններ. ամենահեշտ մեկնարկը։
Թերություններ. չի վերականգնվում անկումից կամ վերագործարկումից հետո — հարմար չէ production-ի համար։
Ինստալացիա.
Մեկնարկ.
Կառավարում.
| Գործողություն | Հրաման |
|---|---|
| Միացնել սեսիայից (թողնել ֆոնում) | Ctrl + A, ապա D |
| Դիտել սեսիաների ցանկը | screen -ls |
| Վերադառնալ սեսիա | screen -r bot |
| Վերջացնել սեսիան ներսից | Ctrl + A, ապա K > Y |
Տեղեկատվություն
Սերվերի վերագործարկումից կամ սկրիպտի անկումից հետո բոտը կմնի կանգնած։ Օգտագործեք միայն ժամանակավոր առաջադրանքների համար։
Մեթոդ 2. systemd — Linux-ի ստանդարտ ծառայությունների համար (հեշտացված)¶
Առավելություններ. ավտոմատ մեկնարկ, վերականգնում սխալների դեպքում, օրագրավորում, համակարգային ինտեգրում։
Թերություններ. պահանջում է կոնֆիգուրացիայի գրել։
-
Ստեղծեք unit ֆայլ.
-
Տեղադրեք կոնֆիգուրացիան (հարմարեցրեք ուղիները և օգտատիրոջը!).
[Unit] Description=Telegram Bot Service After=network.target StartLimitIntervalSec=30 StartLimitBurst=5 [Service] Type=simple User=botuser # ← խորհուրդ չի տրվում root! Group=botuser WorkingDirectory=/home/user/bot ExecStart=/home/user/bot/venv/bin/python /home/user/bot/main.py Restart=always RestartSec=10 Environment="PYTHONUNBUFFERED=1" # որպեսզի օրագրերը բուֆերավորված չլինեն # Անվտանգություն (ընտրովի, բայց խորհուրդ է տրվում) NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/home/user/bot/data/ # եթե բոտը տվյալներին մուտքի կարիք ունի [Install] WantedBy=multi-user.target -
Ակտիվացրեք ծառայությունը.
-
Ստուգեք կարգավիճակը և օրագրերը.
Անվտանգության խորհուրդներ
Մեկուսացրեք ծառայությունը համակարգի անհրաժեշտ չլինող մասերին մուտքից (միջոցով ProtectSystem, ReadOnlyPaths); Եթե բոտը միայն ինտերնետի կարիք ունի՝ ավելացրեք RestrictNetwork=true և կոնֆիգուրացրեք IPAddressAllow=...; Օգտագործեք RuntimeDirectory= ժամանակավոր ֆայլերի համար։
Մեթոդ 3. PM2 — պրոցեսների կառավարիչ (Node.js-ի համար, բայց աջակցում է Python-ին)¶
Առավելություններ. պարզություն, ներկառուցված օրագրեր, մոնիտորինգ, վեբ ինտերֆեյս։
Թերություններ. պահանջում է Node.js, չափազանց շատ պարզ Python բոտների համար։
Ինստալացիա.
# Ինստալացրեք Node.js և npm (եթե դեռ չի ինստալացված)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# Ինստալացրեք PM2 գլոբալ
sudo npm install -g pm2
Մեկնարկեք Python բոտը.
Օգտակար հրամաններ.
| Հրաման | Նպատակ |
|---|---|
pm2 list | Պրոցեսների ցանկ |
pm2 logs my-bot | Դիտել օրագրերը |
pm2 monit | Ռեալ ժամանակի մոնիտորինգ |
pm2 startup | Կոնֆիգուրացնել ավտոմատ մեկնարկը վերագործարկումից հետո |
pm2 save | Պահպանել ընթացիկ պրոցեսները |
Տեղեկատվություն
pm2 startup-ից հետո հետևեք տերմինալի հրահանգներին — PM2-ն կստեղծի systemd unit ավտոմատ մեկնարկի համար։
Մեթոդների համեմատություն¶
| Չափանիշ | screen | systemd | PM2 |
|---|---|---|---|
| Ավտոմատ մեկնարկ վերագործարկումից հետո | Ոչ | Այո | Այո (պահանջում է pm2 startup) |
| Վերականգնում անկումի դեպքում | Ոչ | Այո | Այո |
| Օրագրավորում | Միայն սեսիայում | journalctl | Ներկառուցված օրագրեր |
| Անվտանգություն | Ցածր | Բարձր (մեկուսացման կարգավորումներ) | Միջին |
| Կոնֆիգուրացիայի բարդություն | Ցածր | Միջին | Ցածր (բայց պահանջում է Node.js) |
| Հարմար է production-ի համար | Ոչ | Խորհուրդ է տրվում | Այո (եթե արդեն օգտագործում եք Node.js) |
Լրացուցիչ
Կազմակերպեք զգուշացումներ, երբ բոտը կանգ է առնում (օրինակ՝ systemd + healthchecks.io միջոցով);
Պարբերաբար թարմացրեք կախվածությունները pip list --outdated;
Օգտագործեք .env ֆայլեր և python-dotenv տոկենները պահպանելու համար (և բացառեք դրանք Git-ից!)։