Puncte:5

Script simplu Backup bash cu nohup și rsync

drapel in

Am următoarea comandă simplă pentru a începe procesul meu de backup în fundal cu nohup:

nohup rsync -a /src /target &

Încerc să găsesc o soluție adecvată pentru a captura codul de ieșire și a trimite un mesaj de eșec sau de succes într-un fișier jurnal sau e-mail. Pentru a realiza asta am încercat următoarele:

nohup rsync -a /src/ /target/ &
oldpid=$!
asteapta $oldpid

dacă [[ $? -eq 0 ]]
atunci
        ecou „SUCCES”
altfel
        ecou "FAILED"
fi

Codul pare să funcționeze bine, dar acum nu o fac dacă aceasta este o abordare de încredere. Am doua griji:

  • Ar putea variabila $? să fie suprascris când o altă comandă este executată între ele?
  • Este asteapta $oldpid te joci cu modul asincron al nohup-ului?

Sau poate că această logică este pur și simplu stupidă și pur și simplu există o abordare mai bună?

marcelm avatar
drapel cn
Folosiți cron pentru a rula comanda rsync? Dacă da, v-ați gândit să utilizați [chronic](https://github.com/docwhat/chronic) (și să vă asigurați că cron poate trimite e-mail)?
Puncte:4
drapel cn

Conform intrebarii:

Ar putea variabila $? să fie suprascris când o altă comandă este executată între ele?

Raspunsul este DA. Variabila $? conţine starea de ieşire a ultimei sarcini. De exemplu:

$ fals; eco $?
1
$ fals; Adevărat; eco $?
0
$ fals; Adevărat; fals; eco $?
1

Ca variabila $! conține PID-ul ultimei sarcini de fundal.

Referinţă: Devhints.io: Cheatsheet pentru scripturi Bash


Conform intrebarii:

Este asteapta $oldpid încurcându-se cu modul asincron al nohup?

Nu ar trebui - nu este proiectat exact pentru astfel de sarcini? :)


Conform intrebarii:

Sau poate că această logică este pur și simplu stupidă și pur și simplu există o abordare mai bună?

Pentru mine nu este clar de ce împingi rsync în fundal și apoi aștepta pentru aceasta, în schimb, executați comanda și apoi faceți testul.

#!/bin/bash
rsync -a source.file destination.file 2>/dev/null

dacă [[ $? -eq 0]]; apoi ecou „SUCCES”; else ecou "FAILED"; fi
  • 2>/dev/null este folosit aici pentru a suprima mesajele de eroare ale rsync, dar le puteți salva într-un fișier temporar și îl puteți atașa la e-mail.

Dar probabil că nu este întregul scenariu...


În plus, în primele rânduri ale ajuta sa astepti sunt furnizate următoarele informații.

așteptați: așteptați [-fn] [id ...]

Așteptați finalizarea lucrării și reveniți la starea de ieșire.

Deci, puteți utiliza ieșirea lui aștepta direct în interiorul dacă afirmație. Am făcut deja un test de succes pentru această abordare.

#!/bin/bash
nohup rsync -a source.file destination.file 2>/dev/null &
oldpid=$!

daca asteapta $oldpid
atunci
        ecou „SUCCES”
altfel
        ecou "FAILED"
fi
  • 2>/dev/null este folosit aici pentru a suprima mesajele de eroare ale nohup, in timp ce rsync mesajele de eroare merg undeva în fundal.

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.