Permalänk

Cronjob? Ser ni något fel?

Hej, mitt cronjob funkar inte.
Om jag kör detta som root så funkar det utan problem och en fil skapas i mappen /home/mc/backups.

sudo tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft

Men när jag lägger detta i crontab

* * * * * sudo tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft

och vätar i ett par minuter så skapas ändå ingen fil.
Ser ni något fel?
Mvh Sebastian

CODE-taggar till koden.
Permalänk
Medlem

sudo väntar väl på att ett lösenord ska skrivas in?

Permalänk
Skrivet av iXam:

sudo väntar väl på att ett lösenord ska skrivas in?

så skulle jag skriva root istälet?

Permalänk
Hedersmedlem

Måste det göras som root?

Permalänk
Skrivet av Elgot:

Måste det göras som root?

Tror inte det, ska testa utan

Permalänk
Skrivet av Elgot:

Måste det göras som root?

Funkade inte

Permalänk
Medlem

Du har skrivit stjärna i alla fält, så det ska alltså köras varje minut? Låter som att det kommer skapa mycket backups?

Det som står i /etc/crontab körs väl förövrigt alltid som root, om inte annat specifikt anges? sudo-delen av kommandot är onödigt men tror inte det påverkar resultatet. Jag hade suddat den delen oavsett.

Permalänk
Medlem
Skrivet av anonymous:

Funkade inte

Hur lägger du till det i crontab?

Permalänk
Medlem

Skriver du "crontab -e" redigerar du crontab för den användaren som är inloggad. Skriver du sudo framför redigerar du crontab för root. Skriver du "crontab -eu www-data" redigerar du användaren www-datas crontab.

Permalänk
Skrivet av s0sdaf:

Du har skrivit stjärna i alla fält, så det ska alltså köras varje minut? Låter som att det kommer skapa mycket backups?

Det som står i /etc/crontab körs väl förövrigt alltid som root, om inte annat specifikt anges? sudo-delen av kommandot är onödigt men tror inte det påverkar resultatet. Jag hade suddat den delen oavsett.

Jag valde varje minut för att slippa vänta länge.
Så här ser min crontabv fil atm
http://pastebin.com/GUvA69rW

Skrivet av iXam:

Hur lägger du till det i crontab?

1. crontab -e
Så här ser min crontabv fil atm
http://pastebin.com/GUvA69rW

Permalänk
Hedersmedlem
Skrivet av anonymous:

Funkade inte

Har du behörighet att skriva överallt då?

Permalänk
Skrivet av Elgot:

Har du behörighet att skriva överallt då?

Ja,
jag är medlem i gruppen sudoers
Så här ser min crontabv fil atm
http://pastebin.com/GUvA69rW

Permalänk
Medlem

du borde nog ändra crontab medelst: sudo crontab -eu mc
och lägga in
* * * * * tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft
i den crontaben.

Visa signatur

Jag är en optimist; det är aldrig så dåligt så att det inte kan bli sämre.

Permalänk
Medlem
Skrivet av anonymous:

Jag valde varje minut för att slippa vänta länge.
Så här ser min crontabv fil atm
http://pastebin.com/GUvA69rW

1. crontab -e
Så här ser min crontabv fil atm
http://pastebin.com/GUvA69rW

Om du tänkt att köra en gång i timmen på riktigt sen kan du ju skippa besväret å lägga till ditt skript i /etc/cron.hourly/dittskript.sh så slipper du den krångliga syntaxen.

Permalänk
Hedersmedlem
Skrivet av anonymous:

Hej, mitt cronjob funkar inte.
Om jag kör detta som root så funkar det utan problem och en fil skapas i mappen /home/mc/backups.

sudo tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft

Men när jag lägger detta i crontab

* * * * * sudo tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft

och vätar i ett par minuter så skapas ändå ingen fil.
Ser ni något fel?
Mvh Sebastian

Från manualen (`man 5 crontab`):

The ``sixth'' field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline charac‐ ters, and all data after the first % will be sent to the command as standard input. There is no way to split a single command line onto multiple lines, like the shell's trailing "\".

Se till att escape:a dina %-tecken.

Personligen brukar jag försöka hålla crontab-raderna så enkla som möjligt, och helst bara använda dem för att kalla på externa skript, där man kan lägga in så mycket logik man vill. Här skulle man exempelvis kunna skapa `backup_minecraft` som externt skript och kalla på det via cron.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av zyberzero:

du borde nog ändra crontab medelst: sudo crontab -eu mc
och lägga in
* * * * * tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft
i den crontaben.

Gjorde som du sa och den skapar ändå inga filer.

Skrivet av phz:

Från manualen (`man 5 crontab`):

The ``sixth'' field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline charac‐ ters, and all data after the first % will be sent to the command as standard input. There is no way to split a single command line onto multiple lines, like the shell's trailing "\".

Se till att escape:a dina %-tecken.

Personligen brukar jag försöka hålla crontab-raderna så enkla som möjligt, och helst bara använda dem för att kalla på externa skript, där man kan lägga in så mycket logik man vill. Här skulle man exempelvis kunna skapa `backup_minecraft` som externt skript och kalla på det via cron.

Har du kanske möjlighet att skriva en fil som gör detta?
Har tittat lite på bash men vet inte om det är det bästa alternativet

Permalänk
Hedersmedlem
Skrivet av anonymous:

Ja,
jag är medlem i gruppen sudoers
Så här ser min crontabv fil atm
http://pastebin.com/GUvA69rW

Jo, fast måste du verkligen köra sudo? Borde du inte ha behörighet med det vanliga kontot?

Permalänk
Skrivet av Elgot:

Jo, fast måste du verkligen köra sudo? Borde du inte ha behörighet med det vanliga kontot?

Nej det är inte nödvänligt

Permalänk
Skrivet av Elgot:

Jo, fast måste du verkligen köra sudo? Borde du inte ha behörighet med det vanliga kontot?

Skrivet av phz:

Från manualen (`man 5 crontab`):

The ``sixth'' field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline charac‐ ters, and all data after the first % will be sent to the command as standard input. There is no way to split a single command line onto multiple lines, like the shell's trailing "\".

Se till att escape:a dina %-tecken.

Personligen brukar jag försöka hålla crontab-raderna så enkla som möjligt, och helst bara använda dem för att kalla på externa skript, där man kan lägga in så mycket logik man vill. Här skulle man exempelvis kunna skapa `backup_minecraft` som externt skript och kalla på det via cron.

När jag ändrar det från detta:
* * * * * tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft
till detta:
* * * * * tar -cpzf /home/mc/backups/backup.tar.gz /home/mc/mc/Minecraft
så funkar det perfekt

Permalänk
Hedersmedlem
Skrivet av anonymous:

När jag ändrar det från detta:
* * * * * tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft
till detta:
* * * * * tar -cpzf /home/mc/backups/backup.tar.gz /home/mc/mc/Minecraft
så funkar det perfekt

Precis, här undviker du problemet genom att ta bort alla procenttecken. Vill du ha dem kvar för att formatera utskriften av `date` så måste du "escape:a" dina procenttecken med backslash, dvs i stället för att skriva:

* * * * * echo "Ja så har det ändå äntligen hänt, ska det va ska det va 100%"

så får du skriva

* * * * * echo "Ja så har det ändå äntligen hänt, ska det va ska det va 100\%"

i crontab.

Alternativet är att skapa ett externt skript som genomför backupen, och hålla crontab enkel. I detta fallet är det ju inte så komplexa åtgärder det handlar om, men i praktiken skulle du kunna

  1. skapa det externa skriptet `/home/mc/bin/backup_minecraft` med innehåll:

    #!/bin/sh tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft

  2. göra detta körbart (`chmod +x /home/mc/bin/backup_minecraft`)

  3. kalla på detta genom crontab med en rad likt

    0 0 * * * /home/mc/bin/backup_minecraft

Fördelen är att du är mindre begränsad i hur du utformar ditt skript. Här är det som sagt inte särdeles avancerat i vilket fall, men redan om man börjar använda subskal som du gör här så tycker jag det är smidigare att direkt lägga logik externt (det hade ju exempelvis undvikit problem för dig här). Att det går att använda generella skalkonstruktioner i crontab ser jag mer som en artefakt av dess konstruktion snarare än att det skulle vara ett fundamentalt designval att låta raderna vara Turingkompletta.

Att använda skript som kan köras på egen hand utanför cron gör det också enklare att felsöka, det är lätt att bygga in exempelvis en debugväxel, man kan lätt köra skriptet på godtycklig tid för att testa (i stället för att som du här ställa in cron på att köra raden varje minut för att kunna testa), du kan lättare återanvända logiken mellan flera olika crontabs, med mera. Kort sagt: se crontab mer som en enkel lista på saker att köra (som råkar ha lite extra "bells and whistles" tillgängliga) än en programmeringsmiljö.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av phz:

Precis, här undviker du problemet genom att ta bort alla procenttecken. Vill du ha dem kvar för att formatera utskriften av `date` så måste du "escape:a" dina procenttecken med backslash, dvs i stället för att skriva:

* * * * * echo "Ja så har det ändå äntligen hänt, ska det va ska det va 100%"

så får du skriva

* * * * * echo "Ja så har det ändå äntligen hänt, ska det va ska det va 100\%"

i crontab.

Alternativet är att skapa ett externt skript som genomför backupen, och hålla crontab enkel. I detta fallet är det ju inte så komplexa åtgärder det handlar om, men i praktiken skulle du kunna

  1. skapa det externa skriptet `/home/mc/bin/backup_minecraft` med innehåll:

    #!/bin/sh tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft

  2. göra detta körbart (`chmod +x /home/mc/bin/backup_minecraft`)

  3. kalla på detta genom crontab med en rad likt

    0 0 * * * /home/mc/bin/backup_minecraft

Fördelen är att du är mindre begränsad i hur du utformar ditt skript. Här är det som sagt inte särdeles avancerat i vilket fall, men redan om man börjar använda subskal som du gör här så tycker jag det är smidigare att direkt lägga logik externt (det hade ju exempelvis undvikit problem för dig här). Att det går att använda generella skalkonstruktioner i crontab ser jag mer som en artefakt av dess konstruktion snarare än att det skulle vara ett fundamentalt designval att låta raderna vara Turingkompletta.

Att använda skript som kan köras på egen hand utanför cron gör det också enklare att felsöka, det är lätt att bygga in exempelvis en debugväxel, man kan lätt köra skriptet på godtycklig tid för att testa (i stället för att som du här ställa in cron på att köra raden varje minut för att kunna testa), du kan lättare återanvända logiken mellan flera olika crontabs, med mera. Kort sagt: se crontab mer som en enkel lista på saker att köra (som råkar ha lite extra "bells and whistles" tillgängliga) än en programmeringsmiljö.

Detta va den bästa förklaringen jag sett!
Jag tackar så himla mycket!
Då borde det finnas möjlighet att det kopierar filen till en annan server via sftp också?
Kan du länka till något som skulle kunna göra det så jag kan läsa lite om det. Eller skriva vad jag ska söka på.

Mvh Sebastian

Permalänk
Medlem
Skrivet av anonymous:

Då borde det finnas möjlighet att det kopierar filen till en annan server via sftp också?
Kan du länka till något som skulle kunna göra det så jag kan läsa lite om det. Eller skriva vad jag ska söka på.

Mvh Sebastian

Ta isf och kika lite närmare på "rsync", så hanterar du ev avbrott bättre också

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Skrivet av Schrimp:

Ta isf och kika lite närmare på "rsync", så hanterar du ev avbrott bättre också

Tack ska göra det:)

Permalänk
SpelClockers

Jag misstänker att det är Minecraft-världsdata som du vill backa upp? Då borde du även köra Minecraft i en screen på någon användare (minecraft)?
Du bör skicka kommandot "save-off" och "save-all" i screenen innan backup så servern sparar ned allt som körs i minnet till filer först - för att få en så komplett backup som möjligt. När backupen är klar skickar du "save-on" till Minecraft så den kan återuppta world auto-save.

http://minecraft.gamepedia.com/Tutorials/Server_startup_script - Denna länk behandlar ganska väl hur du sätter upp Minecraft som en tjänst på servern, och även hur du kan ta backup & skicka kommandon genom samma tjänst.

Permalänk
Skrivet av Gix:

Jag misstänker att det är Minecraft-världsdata som du vill backa upp? Då borde du även köra Minecraft i en screen på någon användare (minecraft)?
Du bör skicka kommandot "save-off" och "save-all" i screenen innan backup så servern sparar ned allt som körs i minnet till filer först - för att få en så komplett backup som möjligt. När backupen är klar skickar du "save-on" till Minecraft så den kan återuppta world auto-save.

http://minecraft.gamepedia.com/Tutorials/Server_startup_script - Denna länk behandlar ganska väl hur du sätter upp Minecraft som en tjänst på servern, och även hur du kan ta backup & skicka kommandon genom samma tjänst.

Mycket riktigt, vi andvänder oss utav mcmyadmin och det köra i screen på andvändaren mc.

visste faktiskt inte om detta.
Såhär ser scriptet ut idag

#!/bin/sh tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft cd /home/mc/backups ls -t | sed -e '1,4d' | xargs -d '\n' rm

Vi säger att screenen heter MC
vad behöver jag lägga till för att den ska utföra dom kommandona som du skrev?
Mvh Sebastian

Permalänk
SpelClockers
Skrivet av anonymous:

Mycket riktigt, vi andvänder oss utav mcmyadmin och det köra i screen på andvändaren mc.

visste faktiskt inte om detta.
Såhär ser scriptet ut idag

#!/bin/sh tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft cd /home/mc/backups ls -t | sed -e '1,4d' | xargs -d '\n' rm

Vi säger att screenen heter MC
vad behöver jag lägga till för att den ska utföra dom kommandona som du skrev?
Mvh Sebastian

Du kan använda följande för att skicka kommandon till en screen (som användaren som kör screenen):

SCREEN='MC' COMMAND='say hej' screen -S $SCREEN -X eval 'stuff \"$COMMAND\"\015'

Så för att se till att världen är nedsparad och auto-save avstängd innan backup kör något liknande:

screen -S MC -X eval 'stuff \"save-off\"\015' screen -S MC -X eval 'stuff \"save-all\"\015'

Och sedan efter backup för att återuppta auto-save:

screen -S MC -X eval 'stuff \"save-on\"\015'

Permalänk

Hej, mitt script som ska ta en backup på min mc server ser ut såhär idag.

#!/bin/sh screen -S MC -X eval 'stuff /"save-off"\015' screen -S MC -X eval 'stuff /"save-all"\015' tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft screen -S MC -X eval 'stuff /"save-on"\015' cd /home/mc/backups ls -t | sed -e '1,24d' | xargs -d '\n' rm ftp (open minip) (mittanv) (mittlösenord) put /home/mc/backups/$TIME

Problemet är att ftp delen inte funkar som den ska för jag vet inte hur jag ska göra så att den skickar den filen som skapats men $TIME borde ersättas, ser ni något problem.
Den ska skicka filen som skapats uppe.
Mvh Sebastian

Permalänk
Hedersmedlem
Skrivet av anonymous:

Hej, mitt script som ska ta en backup på min mc server ser ut såhär idag.

#!/bin/sh screen -S MC -X eval 'stuff /"save-off"\015' screen -S MC -X eval 'stuff /"save-all"\015' tar -cpzf /home/mc/backups/backup_$(date +%Y%m%d_%H%M%S).tar.gz /home/mc/mc/Minecraft screen -S MC -X eval 'stuff /"save-on"\015' cd /home/mc/backups ls -t | sed -e '1,24d' | xargs -d '\n' rm ftp (open minip) (mittanv) (mittlösenord) put /home/mc/backups/$TIME

Problemet är att ftp delen inte funkar som den ska för jag vet inte hur jag ska göra så att den skickar den filen som skapats men $TIME borde ersättas, ser ni något problem.
Den ska skicka filen som skapats uppe.
Mvh Sebastian

Du kan använda variabler för att "minnas" namn och liknande enklare. Även funktioner kan generellt vara smidiga. Rigoröst kommenterad prototyp följer; se till att läsa och förstå innan den används (inte minst `find`-raden som raderar filer), och notera också att det är helt otestat från mitt håll:

#!/bin/sh BACKUP_PATH="/home/mc/backups" MC_PATH="/home/mc/mc/Minecraft" TGZ_FILE="backup_$(date +%Y%m%d_%H%M%S).tar.gz" SCREEN_NAME="MC" # När man börjar upprepa sig så är det ofta bra att skapa en funktion så att # man undviker skrivfel och samtidigt håller skriptet mer lättläst. mc_cmd() { # Man får hålla tungan rätt i mun för att hänga med i hur # citationstecknen fungerar här, men det ska vara all right för # närvarande. $1 är helt enkelt det första argumentet när funktionen # kallas. screen -S "$SCREEN_NAME" -X eval 'stuff "/'"$1"'\015"' } mc_cmd save-off mc_cmd save-all tar cpzf "$BACKUP_PATH/$TGZ_FILE" "$MC_PATH" mc_cmd save-on # Denna bit ser inte speciellt robust ut i mina ögon. Man ska alltid vara # defensiv när det gäller att skicka filnamn genom pipes, då filnamn _kan_ # innehålla saker som kan överraska (exempelvis radbrytningar och annat). Även # om man "vet" att de inte gör det så är det inte bra praxis att lära sig # olater, när det finns mer robusta sätt tillgängliga. Ersätt hellre med # exempelvis `find` som rensar allt äldre än 24 dagar (här baserat på dess # datumstämpel snarare än dess filnamn), om det är det du vill. #cd /home/mc/backups #ls -t | sed -e '1,24d' | xargs -d '\n' rm find "$BACKUP_PATH" -mindepth 1 -mtime +24 -delete # Läs `man find` för att se vad ovanstående kommando gör! # Filuppladdning löses troligen enklare om du har ett shellkonto någonstans och # kan köra `rsync` som nämndes tidigare i tråden, men det är också lösbart # genom FTP. # # Så som du har skrivit nu är inte vettigt dock. Varje rad i ett shellskript # exekveras av tolken, så det som du tror hanteras av FTP-programmet # försöker skalet i stället köra som kommandon, vilket lär ge en del # felmeddelanden i bästa fall, och göra något oväntat i sämsta fall. # # Det är dock nästan möjligt att göra som du skriver, men kommandona behöver # skickas in som en sträng. Vi kan göra det med "heredoc"-syntax: #ftp <<EOF #open minip #user mittanv mittlösenord #put "$BACKUP_PATH/$TGZ_FILE" #EOF # Alternativt kan man här använda Curl: curl --upload-file "$BACKUP_PATH/$TGZ_FILE" ftp://minip --user mittanv:mittlösenord # Om detta körs på en "delad dator" så finns det en säkerhetsbrist i att ange # inloggningsuppgifter direkt på kommandoraden. Bättre är att använda en fil # med dessa uppgifter lagrade; se växeln `-n` till Curl för att använda # `~/.netrc` till detta (denna fil går även att använda för `ftp`). # # Man kan även titta på `lftp` och `ncftp` om man vill göra mer avancerade # saker över FTP. # # Notera att det allmänt är lite vanskligt att behöva ange lösenord i klartext, # och FTP är på egen hand väldigt osäkert. Vanligare är att använda # SSH-inloggning med nycklar, om nu fjärrservern man vill köra backup till är # en "vettig dator" som förstår SSH :-) .

Om du tar bort `-delete` från `find`-kommandot så bara skrivs de filer som skulle ha tagits bort ut. Använd detta för att säkerställa att raden gör vad du vill. Notera att det blir fullständigt kaos om du av någon anledning skulle lämna variabeln `BACKUP_PATH` tom, så gör inte det. Kanske du till och med borde ha en extrakontroll innan `find`-raden som säkerställer att du angett en giltig katalog där, typ:

if ! [ -d "$BACKUP_PATH" ]; then printf '%s: fel: "%s" är inte en giltig katalog! Avbryter.\n' "${0##*/}" "$BACKUP_PATH" 1>&2 exit 2 fi find "$BACKUP_PATH" -mindepth 1 -mtime +24 -delete

Det skadar inte att vara defensiv när det handlar om kommandon som exempelvis raderar filer eller på andra sätt kan förändra saker till det sämre.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av phz:

Du kan använda variabler för att "minnas" namn och liknande enklare. Även funktioner kan generellt vara smidiga. Rigoröst kommenterad prototyp följer; se till att läsa och förstå innan den används (inte minst `find`-raden som raderar filer), och notera också att det är helt otestat från mitt håll:

#!/bin/sh BACKUP_PATH="/home/mc/backups" MC_PATH="/home/mc/mc/Minecraft" TGZ_FILE="backup_$(date +%Y%m%d_%H%M%S).tar.gz" SCREEN_NAME="MC" # När man börjar upprepa sig så är det ofta bra att skapa en funktion så att # man undviker skrivfel och samtidigt håller skriptet mer lättläst. mc_cmd() { # Man får hålla tungan rätt i mun för att hänga med i hur # citationstecknen fungerar här, men det ska vara all right för # närvarande. $1 är helt enkelt det första argumentet när funktionen # kallas. screen -S "$SCREEN_NAME" -X eval 'stuff "/'"$1"'\015"' } mc_cmd save-off mc_cmd save-all tar cpzf "$BACKUP_PATH/$TGZ_FILE" "$MC_PATH" mc_cmd save-on # Denna bit ser inte speciellt robust ut i mina ögon. Man ska alltid vara # defensiv när det gäller att skicka filnamn genom pipes, då filnamn _kan_ # innehålla saker som kan överraska (exempelvis radbrytningar och annat). Även # om man "vet" att de inte gör det så är det inte bra praxis att lära sig # olater, när det finns mer robusta sätt tillgängliga. Ersätt hellre med # exempelvis `find` som rensar allt äldre än 24 dagar (här baserat på dess # datumstämpel snarare än dess filnamn), om det är det du vill. #cd /home/mc/backups #ls -t | sed -e '1,24d' | xargs -d '\n' rm find "$BACKUP_PATH" -mindepth 1 -mtime +24 -delete # Läs `man find` för att se vad ovanstående kommando gör! # Filuppladdning löses troligen enklare om du har ett shellkonto någonstans och # kan köra `rsync` som nämndes tidigare i tråden, men det är också lösbart # genom FTP. # # Så som du har skrivit nu är inte vettigt dock. Varje rad i ett shellskript # exekveras av tolken, så det som du tror hanteras av FTP-programmet # försöker skalet i stället köra som kommandon, vilket lär ge en del # felmeddelanden i bästa fall, och göra något oväntat i sämsta fall. # # Det är dock nästan möjligt att göra som du skriver, men kommandona behöver # skickas in som en sträng. Vi kan göra det med "heredoc"-syntax: #ftp <<EOF #open minip #user mittanv mittlösenord #put "$BACKUP_PATH/$TGZ_FILE" #EOF # Alternativt kan man här använda Curl: curl --upload-file "$BACKUP_PATH/$TGZ_FILE" ftp://minip --user mittanv:mittlösenord # Om detta körs på en "delad dator" så finns det en säkerhetsbrist i att ange # inloggningsuppgifter direkt på kommandoraden. Bättre är att använda en fil # med dessa uppgifter lagrade; se växeln `-n` till Curl för att använda # `~/.netrc` till detta (denna fil går även att använda för `ftp`). # # Man kan även titta på `lftp` och `ncftp` om man vill göra mer avancerade # saker över FTP. # # Notera att det allmänt är lite vanskligt att behöva ange lösenord i klartext, # och FTP är på egen hand väldigt osäkert. Vanligare är att använda # SSH-inloggning med nycklar, om nu fjärrservern man vill köra backup till är # en "vettig dator" som förstår SSH :-) .

Om du tar bort `-delete` från `find`-kommandot så bara skrivs de filer som skulle ha tagits bort ut. Använd detta för att säkerställa att raden gör vad du vill. Notera att det blir fullständigt kaos om du av någon anledning skulle lämna variabeln `BACKUP_PATH` tom, så gör inte det. Kanske du till och med borde ha en extrakontroll innan `find`-raden som säkerställer att du angett en giltig katalog där, typ:

if ! [ -d "$BACKUP_PATH" ]; then printf '%s: fel: "%s" är inte en giltig katalog! Avbryter.\n' "${0##*/}" "$BACKUP_PATH" 1>&2 exit 2 fi find "$BACKUP_PATH" -mindepth 1 -mtime +24 -delete

Det skadar inte att vara defensiv när det handlar om kommandon som exempelvis raderar filer eller på andra sätt kan förändra saker till det sämre.

Jag tackar så himla mycket! Jag har lärt mig sjukt mycket. Och tack för tipsen.
Jag vet att man inte ska föredra ftp på grund att det inte är lika säkert som sftp men i detta fallet kör vi scriptet på linux och windows server på den andra. Och jag har inte hittat någon bra sftp / ssh server till windows server. Sen står servrarna i samma rack så tanken är att köra en patchkabel mellan main och backup så det bara är lokalt och gigabit:)
Så i detta fallet kommer ftp funka perfekt.
Tack så mycket än en gång!
Glad att folk tar tid.
Mvh Sebastian

Permalänk
SpelClockers
Skrivet av anonymous:

Jag vet att man inte ska föredra ftp på grund att det inte är lika säkert som sftp men i detta fallet kör vi scriptet på linux och windows server på den andra. Och jag har inte hittat någon bra sftp / ssh server till windows server.

Om du vill ha kryptering på FTP-sessionen så har FileZilla Server stöd för FTPS (FTP over TLS).

Fel akronym