Stavo facendo un cron job per salvare il mio mondo di Minecraft dalla mia ram ogni 5 minuti.
Ho testato lo script e sembra funzionare.
Ecco come appare lo script:
#!/bin/sh
VOLATILE="/home/jonathan/Games/Minecraft/Server/world/"
PERMANENT="/home/jonathan/Games/Minecraft/Server/world_storage/"
rsync -r -t -v "$VOLATILE" "$PERMANENT"
Quindi sono andato ad aggiungere un lavoro cron per eseguire lo script ogni 5 minuti e sembra non eseguirlo.
Questo è lo script che ho usato:
*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh
Qualcuno può aiutarmi per favore?
Risposta accettata:
Non hai specificato come hai aggiunto il tuo cronjob. Questo fa una grande differenza:se hai usato crontab -e
all'interno del tuo account, gli script vengono eseguiti con il tuo utente (e quindi la voce crontab ha un campo in meno:l'utente che lo esegue, come è noto). Se hai semplicemente copiato lo snippet sopra in /etc/cron.d
, fallirebbe perché non hai specificato un utente (o meglio perché non trova alcun utente chiamato "bash"). Quindi dovresti eseguire i seguenti passaggi:
- aggiorna la tua domanda con informazioni su come hai aggiunto il lavoro cron
- controlla i log di sistema (
/var/log/syslog
; potrebbero indicare possibili errori) - aggiungi dell'output di debug al tuo
Backup.sh
script per vedere se è avviato
Il terzo punto può essere raggiunto in diversi modi:
- aggiungi un
>>/tmp/testlog.log
alla fine della tua voce crontab (per reindirizzare l'output a un file su cui puoi investigare; inoltre, un2>&1
includerebbe l'output dalla console degli errori) - aggiungi alcune righe al tuo script stesso, come ad es.
echo "Backup.sh started">/tmp/testlog.log
Inoltre:poiché intendi eseguire lo script utilizzando bash
, non dovresti dirgli di usare /bin/sh
(che farebbe usare dash
su un'installazione Ubuntu predefinita), ma piuttosto /bin/bash
. Quindi rendilo eseguibile e puoi persino omettere "bash" dalla tua voce crontab.
Aggiornamento:
Secondo il tuo commento sulla mia risposta, hai usato crontab -e
per creare il lavoro e in base ai registri di sistema viene eseguito, ma la definizione è piuttosto
*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh &>/dev/null
Questo reindirizza tutto l'output alla memoria più grande del tuo sistema, il "buco nero":/dev/null
mangia tutto (ma non restituisce mai nulla). Il reindirizzamento di STDOUT e STDERR in questo modo ti priva di qualsiasi segnalazione di errore, quindi non sai mai che sono accaduti, per non parlare dei dettagli. Per il test, dovresti omettere &>/dev/null
parte completamente. Anche se funziona, dovresti solo sopprimere l'output non necessario, altrimenti non saprai mai quando qualcosa va storto. Quindi è meglio omettere almeno la e commerciale, in modo che Cron possa segnalare eventuali errori che si verificano.
Inoltre:una volta che l'output è stato reindirizzato (come nel tuo caso a /dev/null
), l'aggiunta di un altro reindirizzamento alla fine non produrrà alcun risultato, poiché tutto è già andato. Quindi devo modificare il consiglio di cui sopra da "aggiungi ... alla fine della tua voce crontab" a "sostituirlo nella tua voce crontab" 😉