−25%

kwa Windows ya mwaka, hadi 31 Okt. Tazama mipango

EQVPS
Anza

Jinsi ya kuendesha skripti 24/7 kwenye Windows Server: inastahimili kutoka, kuanguka na kuwashwa upya

Weka boti au skripti ikifanya kazi saa zote kwenye VPS ya Windows Server 2022 kwa Task Scheduler pekee: inaanza wakati wa kuwasha bila mtu yeyote kuingia, inaanza tena ndani ya dakika moja baada ya kuanguka, na kamwe nakala mbili. Tuliiua na kuwasha seva upya ili kukagua.

Njia ya kawaida ya kuendesha boti kwenye VPS ya Windows ni kuianzisha katika kipindi cha RDP na kufunga dirisha. Inafanya kazi hadi sasisho liwashe seva upya saa tisa usiku na hakuna kitu kiianzishe tena. Task Scheduler, ambayo tayari iko kwenye kila Windows Server, hutatua hili bila programu ya ziada. Usanidi hapa chini:

  • huanzisha skripti wakati wa kuwasha, kabla mtu yeyote hajaingia;
  • huianzisha tena ndani ya dakika moja ikianguka au ikiuawa;
  • kamwe haiendeshi nakala mbili kwa wakati mmoja.

Tulijaribu yote matatu kwenye picha yetu ya Windows Server 2022: tuliua mchakato, tukawasha seva upya, na tukahesabu nakala.

Skripti ya mfano

Mbadala wa boti yako: huandika mstari kila sekunde 10, kwa hiyo ni rahisi kuona kama iko hai.

New-Item -ItemType Directory -Force C:\bots | Out-Null
Set-Content C:\bots\heartbeat.ps1 -Encoding ascii -Value @'
while ($true) {
    Add-Content -Path C:\bots\heartbeat.log -Value ("{0:u} pid {1}" -f (Get-Date), $PID)
    Start-Sleep -Seconds 10
}
'@

Sajili kazi

Endesha katika PowerShell ya msimamizi:

$action   = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -ExecutionPolicy Bypass -File C:\bots\heartbeat.ps1' -WorkingDirectory 'C:\bots'
$atBoot   = New-ScheduledTaskTrigger -AtStartup
$everyMin = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 1)
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit ([TimeSpan]::Zero) -MultipleInstances IgnoreNew -StartWhenAvailable
Register-ScheduledTask -TaskName 'mybot' -Action $action -Trigger $atBoot, $everyMin -Settings $settings -User 'SYSTEM' -RunLevel Highest
Start-ScheduledTask -TaskName 'mybot'

Kila sehemu inafanya nini:

  • -AtStartup huanzisha boti Windows inapowaka, bila mtumiaji aliyeingia.
  • Kurudia kwa kila dakika huendesha kazi tena kila dakika. Boti ikiwa hai, hakuna kinachotokea; ikiwa imekufa, inaanza tena.
  • -MultipleInstances IgnoreNew ndio hufanya kurudia kuwe salama: uendeshaji unaokuta boti tayari ikifanya kazi unarukwa.
  • -ExecutionTimeLimit 0 huzima kikomo cha msingi cha saa 72, ambacho baada yake Task Scheduler ingesimamisha boti.
  • -User 'SYSTEM' huiendesha bila nenosiri wala kipindi. SYSTEM ina haki kamili kwenye seva, kwa hiyo endesha kwa njia hii msimbo wako mwenyewe pekee.

Kwa Python, badilisha kitendo:

$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py' -WorkingDirectory 'C:\bots'

Tulichokagua

Kuanguka. Tuliua mchakato wa boti kwa Stop-Process -Force. Sekunde 46 baadaye kichochezi cha dakika kilikuwa kimeanzisha mpya, na kulikuwa na nakala moja hasa.

Kuwasha upya. Tuliwasha seva upya na hatukuingia. Sekunde 40 baada ya kuwaka boti ilikuwa ikiandika kwenye kumbukumbu yake, bila vipindi vya watumiaji kwenye seva.

Kisichofanya kazi. Mambo mawili yanaonekana sahihi lakini sivyo:

  1. "Kazi ikishindwa, anza tena kila…" Tuliiweka, tukaua mchakato, na kazi ilikaa katika hali ya Ready kwa dakika kadhaa. Hujibu kazi inaposhindwa kuanza, si programu yako inapokufa baadaye.
  2. Mzunguko wa kufunika (while ($true) { & bot; sleep 5 }). Huanzisha tena boti iliyoanguka, lakini kifuniko chenyewe kikifa, mtoto wake huendelea kufanya kazi, na uanzishaji unaofuata huzindua boti ya pili. Tuliishia na nakala mbili, ambazo kwa boti ya Telegram ni michakato miwili inayogombania masasisho yaleyale.

Jinsi ya kuikagua

Get-ScheduledTask -TaskName mybot | Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName mybot | Select-Object LastRunTime, NextRunTime
Get-Content C:\bots\heartbeat.log -Tail 5

Ili kuisimamisha kwa matengenezo, kwanza Disable-ScheduledTask mybot (vinginevyo kichochezi cha dakika kitaianzisha tena), kisha simamisha mchakato. Enable-ScheduledTask mybot huirudisha.

Kumbukumbu

Kazi hainasi matokeo. Ifanye boti iandike faili yake ya kumbukumbu, kama mfano unavyofanya, au elekeza matokeo katika kizindua kidogo cha .cmd na uelekeze -Execute kwenye faili hiyo.

Mpango gani

Boti ya PowerShell au Python hutumia CPU kidogo, lakini Windows yenyewe huchukua GB 1 hadi 1.3 za RAM ikiwa haifanyi kazi kwenye picha yetu. Windows-Small (vCPU 4, GB 4 za RAM, GB 50, $11 kwa mwezi) ni ukubwa sahihi kwa boti moja au mbili. Kwenye mpango wa NAT, miunganisho ya kutoka (Telegram, API za soko, webhooks unazoita) hufanya kazi kama kawaida. Boti ikihitaji kupokea webhooks au trafiki nyingine ya kuingia, chagua Windows Small-IP ($28 kwa mwezi) yenye IPv4 yake.

Hatua zinazofuata: linda RDP na, ukipendelea kusimamia boti kupitia SSH, sakinisha OpenSSH. Malipo ni kwa USDT, USDC au ETH, na Windows ni Server 2022 yenye leseni yako mwenyewe (BYOL). Mipango yote: VPS ya Windows.

Maswali

Kwa nini nisiache skripti ikifanya kazi katika kipindi changu cha RDP?

Inafanya kazi hadi kitu kimalize kipindi: kutoka, kuwasha upya kwa sababu ya sasisho, au kuanguka. Kufunga dirisha la RDP (kukata muunganisho) huacha kipindi hai, lakini kutoka huua kila kitu ndani yake, na baada ya kuwasha upya hakuna aliyeingia wa kuianzisha tena. Kazi iliyoratibiwa haitegemei kipindi chochote.

Je, Task Scheduler haina mpangilio wa 'anza tena ikishindwa'?

Inayo, lakini haikusaidia katika jaribio letu. Tulipoua mchakato wa skripti, kazi ilienda tu kwenye hali ya 'Ready' na kubaki hapo. Mpangilio huo hujibu kazi inaposhindwa kuanza, si programu yako inapokufa baadaye. Kichochezi kinachojirudia katika mwongozo huu ndicho kinachoirudisha kwa kweli.

Je, nakala mbili za boti yangu zinaweza kuishia zikifanya kazi?

Si kwa usanidi huu. Kazi huendesha boti yenyewe (bila skripti ya kufunika) na hutumia MultipleInstances IgnoreNew, kwa hiyo kichochezi cha kila dakika hakifanyi kitu boti ikiwa hai. Mzunguko wa kufunika ndio huunda nakala: ua kifuniko na mtoto wake huendelea kufanya kazi huku kifuniko kipya kikianzisha kingine. Tuliona hasa hilo.

Je, inafanya kazi kwa Python au Node.js?

Ndiyo. Weka mkalimani katika -Execute na skripti katika -Argument, kwa njia kamili, kwa mfano -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py'. Sakinisha mkalimani kwa watumiaji wote ili akaunti ya SYSTEM iweze kuupata.

Maoni

Bado hakuna maoni. Kuwa wa kwanza.

Acha maoni

Maoni yanakaguliwa kabla ya kuonekana.