Բոթի աշխատանքը ֆոնային ռեժիմում¶
Այս հոդվածում
Որպեսզի Python (կամ ցանկացած այլ) բոթը աշխատի շարունակաբար, ավտոմատ կերպով վերագործարկվի սխալների դեպքում և մեկնարկվի սերվերի վերագործարկումից հետո, պարզապես python main.py գրելը բավարար չէ: Ձեզ անհրաժեշտ է լիարժեք ֆոնային ծառայություն (background service):
Ստևր ներկայացված են երեք փորձված մեթոդներ՝ պարզ screen-ից մինչև արդյունավետ systemd: Ընտրեք ձեր պահանջներից ելնելով:
Պատրաստման միջոցառումներ¶
-
Տեղադրեք բոթի կոդը, օրինակ՝
/home/user/botթղթապանակում. -
Ստեղծեք և ակտիվացրեք վիրտուալ միջավայրը՝ կախվածություններն առանձնացնելու համար.
-
Տեղադրեք անհրաժեշտ գրադարանները.
-
Փորձարկեք ձեռքով մեկնարկը.
Նշում
Մի՛ աշխատեցրեք բոթը root օգտվողի անունից, եթե դա անհրաժեշտ չէ: Ավելի լավ է ստեղծել առանձին օգտվող.
Մեթոդ 1. screen - արագ մեկնարկ (թեստավորման և մշակման համար)¶
Առավելություններ: ամենապարզ տարբերակն է սկսելու համար:
Թերություններ: չի վերագործարկվում անկումից կամ վերագործարկումից հետո՝ չի պիտանի production-ի համար:
Տեղադրում.
Մեկնարկ.
Կառավարում.
| Գործողություն | Հրաման |
|---|---|
| Դուրս գալ սեսիայից (թողնել ֆոնային ռեժիմում) | Ctrl + A, այնուհետև D |
| Տեսնել սեսիաների ցանկը | screen -ls |
| Վերադառնալ սեսիա | screen -r bot |
| Անջատել սեսիան ներսից | Ctrl + A, այնուհետև K > Y |
Տեղեկاتվություն
Սերվերի վերագործարկման կամ սկրիպտի անկման դեպքում բոթը կմնա կանգնեցված: Օգտագործեք միայն ժամանակավոր առաջադրանքների համար:
Մեթոդ 2. systemd - Linux-ի ստանդարտ ծառայությունների համար (խորհուրդ տրվող)¶
Առավելություններ: ավտոմատ մեկնարկ, վերագործարկում սխալների դեպքում, լոգերի (logging) առկայություն, համակարգային ինտեգրում:
Թերություններ: պահանջում է կոնֆիգուրացիայի գրում:
-
Ստեղծեք unit ֆայլ.
-
Տեղադրեք կոնֆիգուրացիան (փոխեք paths և user փոփոխականները!):
[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" # որպեսզի լոգերը չհատնվեն (buffered) # Անվտանգություն (ընտվիրական, բայց խորհուրդ է տրվում) 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
Մեկնարկ.
Կառավարում.
| Հրաման | Նպատակը |
|---|---|
pm2 list | Պրոցեսների ցանկ |
pm2 logs my-bot | Լոգերի դիտում |
pm2 monit | Իրական ժամանակում մոնիթորինգ |
pm2 startup | Կարգավորել ավտոմատ մեկնարկը վերագործարկումից հետո |
pm2 save | Պահպանել ընթացիկ պրոցեսները |
Տեղեկատվություն
pm2 startup հրամանից հետո հետևեք տերմինալի հրահանգներին. PM2-ը կստեղծի systemd unit ավտոմատ մեկնարկի համար:
Համեմատություն¶
| Կրիտերիում | screen | systemd | PM2 |
|---|---|---|---|
| Ավտոմատ մեկնարկ վերագործարկումից հետո | Ոչ | Այո | Այո (պահանջում է pm2 startup) |
| Վերագործարկում անկումից հետո | Ոչ | Այո | Այո |
| Լոգեր (Logging) | Միայն սեսիայում | journalctl | Ներկառուցված լոգեր |
| Անվտանգություն | Ցածր | Բարձր (isolation settings) | Միջին |
| Կոնֆիգուրացիայի բարդություն | Ցածր | Միջին | Ցածր (բայց պահանջում է Node.js) |
| Պիտանի է production-ի համար | Ոչ | Խորհուրդ է տրվում | Այո (եթե արդեն օգտագործում եք Node.js) |
Լրացուցիչ
Կարգավորեք ծանուցումներ, երբ բոթը կանգնում է (օրինակ՝ systemd + healthchecks.io միջոցով);
Պարբերաբար թարմացրեք կախվածությունները pip list --outdated;
Օգտագործեք .env ֆայլեր և python-dotenv՝ թոքենները պահպանելու համար (և բացառեք դրանք Git-ից!):