Puncte:0

Sarcina programată Windows - sarcina cu script cmd rulează, dar aplicația de consolă .NET nu

drapel co

Creez sarcini programate Windows într-un container Docker cu Powershell. Ca test, am un fișier batch simplu care scrie data/ora curentă într-un fișier text o dată pe oră. Aceasta funcționează perfect:

RUN $action = New-ScheduledTaskAction -Execută „C:\folder\task-tester.cmd”; \
    $trigger = New-ScheduledTaskTrigger -Daily -At 12am; \
    $settings = New-ScheduledTaskSettingsSet; \
    $task = Register-ScheduledTask -TaskName 'Scrie în fișier text' -Utilizator 'SYSTEM' -Trigger $trigger -Action $action -Settings $settings; \
    $task.Triggers.Repetition.Duration = 'P1D'; \
    $task.Triggers.Repetition.Interval = 'PT1H'; \
    $sarcină | Set-ScheduledTask

Când încerc să execut o aplicație de consolă .NET, nu funcționează.

RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\thingy.exe' -WorkingDirectory 'C:\folder'; \
    $trigger = New-ScheduledTaskTrigger -Daily -At 10am; \
    $settings = New-ScheduledTaskSettingsSet; \
    Register-ScheduledTask -TaskName „Numele sarcinii” -Utilizator „SYSTEM” -Trigger $trigger -Action $action -Settings $settings

Mai exact, cel sarcină pare să ruleze - data/ora „ultimei rulări” este corectă și rezultatul este 0 (zero), dar aplicația de consolă în sine nu este executată.

În comanda de mai sus, stabilesc directorul de lucru (o capcană comună cu aplicațiile de consolă .NET).

Dacă fac SSH în container, pot executa „thing.exe” și funcționează conform așteptărilor. Dacă execut manual sarcina programată prin PowerShell Start-ScheduleTask, din nou, nu pare să se întâmple nimic.

Am încercat să interog jurnalul de evenimente cu PowerShell, dar nu pot vedea nimic imediat util.

O variație a comenzii de mai sus cu opțiuni mai explicite, cum ar fi compatibilitatea și nivelul de rulare, produce același rezultat - adică sarcina nu rulează:

RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\thingy.exe' -WorkingDirectory 'C:\folder' ; \
    $trigger = New-ScheduledTaskTrigger -Daily -At 10am; \
    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8; \
    $principal = New-ScheduledTaskPrincipal -UserID 'NT AUTHORITY\SYSTEM' -LogonType ServiceAccount -RunLevel Cel mai înalt; \
    Register-ScheduledTask -TaskName „Numele sarcinii” -Trigger $trigger -Action $action -Settings $settings -Principal $principal

A mai întâlnit cineva asta și a rezolvat-o? Sau mă poate ajuta cineva să obțin mai multe informații de diagnosticare din containerul cu PowerShell?

Mulțumiri!

Puncte:0
drapel co

Pentru oricine s-ar putea confrunta cu asta în viitor:

Am mai mult de un proces care rulează în container (știu, acest lucru nu este ideal, dar în acest caz inevitabil), iar problema în cazul meu a fost că variabilele de mediu nu erau disponibile pentru procesele invocate de sarcinile programate.

Când variabilele de mediu sunt create ca parte a unei versiuni Docker, orice variabile de mediu create sunt vizibile numai pentru procesul pornit de Docker - de exemplu IIS. Sarcinile mele programate trebuiau, de asemenea, să acceseze aceleași env vars.

Soluția a fost schimbarea punctului de intrare din dockerfile într-un script PowerShell, așa cum sugerează Acest articol.

ENTRYPOINT [„powershell.exe”, „C:\bootstrap.ps1”]

Acest script bootstrap poate face tot ce doriți și, în acest caz, îmi permite să „promovez” vars-urile env transmise procesului început de Docker (acum acest script) la nivel de mașină, astfel încât să fie vizibile pentru alte procese din container.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.