Puncte:3

Programarea sarcinilor în prim-plan în Linux, similară cu Task Scheduler din Windows

drapel cn

Am o aplicație batch pe Windows pe care o rulez în fiecare zi la miezul nopții. Recent, am convertit acest lucru într-un script shell Linux pe o mașină Linux și aș dori să îl rulez în mod similar în fiecare zi la miezul nopții. Cerințele mele sunt următoarele: -

  • Pentru ca scriptul shell să ruleze în prim-plan - acest lucru îmi permite să văd rezultatul procesului care rulează și să corectez/remediez lucrurile dacă nu reușește.
  • Similar cu modul în care funcționează programatorul de activități Windows, aș dori să am o listă de scripturi pe care le pot rula și acele liste pot fi activate/dezactivate.
  • (Opțional) În mod ideal, echivalentul Task Scheduler poate fi modificat programatic. Acest lucru mi-ar permite să dezactivez/activez sarcini pe baza rezultatului unei sarcini deja executate.

Este acest lucru realizabil? Am văzut linkurile de mai jos, dar nu conțin toate criteriile de care am nevoie pentru cazul meu de utilizare. Dacă unul dintre linkurile de mai jos este modalitatea corectă de a merge, atunci un exemplu poate fi foarte util.

mchid avatar
drapel bo
Puteți explica, vă rog, de ce nu vă îndeplinesc criteriile? Vă rugăm să fiți specifici. În caz contrar, doar vom ghici ceva la care te-ai gândit deja și poate ne vom pierde timpul. Mulțumiri.
mchid avatar
drapel bo
BTW, [pentru a rula un job cron la miezul nopții](https://crontab.guru/every-night-at-midnight), ați prefix comanda sau calea către script-ul dvs. cu `0 0 * * *` De exemplu , pentru a rula `/home/youssif/myscript` , ați folosi `0 0 * * /home/youssif/myscript` în fișierul crontab. Pentru a edita fișierul crontab, utilizați `crontab -e` pentru a rula comanda ca utilizator curent. Alternativ, dacă trebuie neapărat să rulați comanda ca root, puteți rula `sudo crontab -e` pentru a edita fișierul crontab.
mchid avatar
drapel bo
Minutul este 0. Ora este 0. În fiecare zi a lunii = * În fiecare lună = * În fiecare zi a săptămânii = *
Zanna avatar
drapel kr
Acest lucru este destul de larg pentru site-ul nostru. Ar putea fi de ajutor dacă explicați ce face scriptul sau îl distribuiți în întrebare. În mod ideal, v-aș recomanda să încercați și să identificați problemele cu care vă confruntați, astfel încât să puteți pune întrebări mai specifice.
Puncte:8
drapel bo

Pentru a rula un job cron la miezul nopții, ați prefix comanda sau calea către script-ul dvs. cu:

0 0 * * *

De exemplu, să alerg /home/youssif/myscript , ai folosi:

0 0 * * /home/youssif/myscript

în fișierul tău crontab.


Pentru a edita fișierul crontab, utilizare crontab -e pentru a rula comanda ca utilizator curent. Alternativ, dacă trebuie neapărat să rulați comanda ca root, puteți rula sudo crontab -e pentru a edita fișierul crontab.


Pentru a rula comanda într-un terminal (nu este o idee bună dacă rulați comanda ca root), va trebui să specificați afișajul de utilizat în comandă sau în script. Pentru a face acest lucru, presupunând că dvs $DISPLAY este :0 (implicit) puteți prefix comanda cu următoarea variabilă:

DISPLAY=:0

De asemenea, un terminal se va închide de obicei după ce comanda este executată, dar puteți utilizați opțiunea hold cu xterm pentru a menține terminalul deschis.

Deci, să alerg ecou „bună lume” într-un terminal la miezul nopții, comanda ta ar arăta astfel:

0 0 * * DISPLAY=:0 xterm -hold -e 'echo "bună lume"'

sau pentru a rula scriptul:

0 0 * * DISPLAY=:0 xterm -hold -e '/home/youssif/myscript'

Cu toate acestea, modalitatea standard de a inspecta ieșirea unui cronjob este redirecționarea ieșirii terminalului către un fișier pe care îl puteți consulta mai târziu.

De exemplu, pentru a redirecționa ieșirea terminalului către fișier /home/youssif/helloworld.log veți folosi următoarea linie în fișierul crontab:

0 0 * * echo "hello world" > /home/youssif/helloworld.log

Alternativ, puteți utiliza și tricou comandă pentru a redirecționa rezultatul astfel:

0 0 * * ecou „bună lume” | tee /home/youssif/helloworld.log

În cele din urmă, puteți utiliza pisică comandă pentru a vizualiza conținutul fișierului:

pisica /home/youssif/helloworld.log

În acest fel, comanda poate rula în fundal, dar puteți încă inspecta ieșirea.


Pentru a dezactiva/activa sarcini pe baza rezultatului unei sarcini deja executate, cred că acest lucru ar fi într-adevăr mai potrivit pentru o întrebare separată. Cred că răspunsul dvs. ar implica folosirea unei declarații „dacă atunci altfel” într-un script bash.


EDITAȚI | ×:

La fel de a subliniat @Tcooper, trebuie să adăugăm 2>&1 pentru a redirecționa toată ieșirea, inclusiv mesajele de eroare așa că s-ar putea să doriți să utilizați ceva de genul acesta în schimb:

0 0 * * echo "hello world" 2>&1 > /home/youssif/helloworld.log

sau

0 0 * * echo „bună lume” 2>&1 | tee /home/youssif/helloworld.log
mchid avatar
drapel bo
Cu toate acestea, cred că probabil **nu este o idee bună să rulați un crontab în terminal ca root. Acest lucru ar putea duce la pierderea permisiunilor corecte din fișierul Xauthority.** Este posibil să nu fie o problemă cu Wayland, dar nu sunt sigur. Acesta este unul dintre numeroasele motive pentru care cel mai bine este ca rezultatul să fie redirecționat către un fișier.
Youssif Saeed avatar
drapel cn
Vă mulțumim pentru răspunsul dumneavoastră detaliat. L-am testat și la mine funcționează. Este exact ceea ce aveam nevoie pentru a începe.
TCooper avatar
drapel cn
Probabil merită menționat dacă doriți ca toate rezultatele să meargă în fișierul dvs. jurnal și nicăieri altundeva, adăugați „2>&1” unde 2 este ieșirea de eroare standard și 1 este ieșire standard. Prin urmare, trimiteți erorile la ieșirea standard și scoateți toate în fișierul dvs. jurnal. Sau, alternativ, la două fișiere jurnal diferite: „2>err_log.txt 1>cron_log.txt” - nedeclarând acest lucru implicit în e-mailul de sistem pentru erori cron, ceea ce mi se pare... enervant, cel puțin în comparație cu utilizarea unui fișier jurnal
drapel fr
A.L
`0 0 * * echo "hello world" > /home/youssif/helloworld.log` va șterge jurnalul în fiecare zi. Cu `>>` va adăuga conținutul la sfârșitul fișierului, în fiecare zi.
mchid avatar
drapel bo
@A.L Da, am decis să merg cu asta pentru că ar fi mai mult ca deschiderea unui terminal și furnizarea de ieșire pentru o singură sesiune. Cred că ar fi mai bine să adăugați o dată pentru a prefix jurnalele și asta părea că ar complica un răspuns deja complicat.
Puncte:4
drapel cn

Toate aceste cerințe pot fi îndeplinite cu ușurință. Modul tradițional de a programa joburi în Linux este crontab. Modul „modern” de a programa joburi în linux este systemd. crontab continuă să fie acceptat pe Ubuntu.

Ta Cerința 1: este neobișnuit: așteptați la computer la miezul nopții când începe sarcina? În caz contrar, de aceea fișierele jurnal sunt folosite în Linux. Administratorul de sistem poate apoi inspecta jurnalele în timpul zilei pentru a verifica cum au decurs lucrurile.

Dacă este necesar, joburile pot fi lansate într-un emulator de terminal grafic. Acest lucru, totuși, necesită să fiți conectat oricând, ceea ce poate fi mai puțin ideal din punct de vedere al securității.

crontab și/sau systemd satisface cerința 2. Vedeți lista dvs. de locuri de muncă în rezultatul listă-unități systemd sau în crontab fişier. Puteți activa/dezactiva/elimina prin systemd comenzi sau prin eliminarea/adăugarea unui comentariu # semnați în fața sarcinii sau ștergeți complet linia.

Cerința 3 poate fi ușor de scriptat. O lucrare ulterioară poate citi ceea ce a făcut o lucrare anterioară și poate acționa în consecință.

Puncte:0
drapel es

Trebuie să subliniez că unele dintre ceea ce întrebați sunt destul de neconvenționale și din motive întemeiate. De exemplu, rularea unei sarcini programate în prim-plan înseamnă că rezultatul se va pierde odată ce depășește tamponul de derulare înapoi (adică capacitatea de a stoca „istoricul ieșirilor”) al terminalului dumneavoastră. De aceea este mult mai convențional să trimiți rezultatul într-un fișier jurnal în loc să îl afișezi direct în terminal și vă recomand cu siguranță să respectați convenția aici.

Acestea fiind spuse... supercronic este un planificator de sarcini pe care îl puteți rula ca utilizator obișnuit (non-root), în prim-plan, care are capacitatea de a înregistra ieșirea direct la terminal. Citește un fișier asemănător crontab în care puteți specifica o listă de scripturi de rulat și orele la care să le rulați și puteți aranja ca un proces automat să editeze fișierul și să semnaleze procesul supercronic, astfel încât să preia modificările . Deci, pare să îndeplinească toate cerințele dumneavoastră.

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.