Dělal jsem práci cron, abych každých 5 minut zachránil můj svět Minecraftu z ram.
Testoval jsem skript a zdá se, že funguje.
Takto vypadá skript:
#!/bin/sh
VOLATILE="/home/jonathan/Games/Minecraft/Server/world/"
PERMANENT="/home/jonathan/Games/Minecraft/Server/world_storage/"
rsync -r -t -v "$VOLATILE" "$PERMANENT"
Potom jsem šel přidat úlohu cron, abych spouštěl skript každých 5 minut, a zdá se, že jej nespouští.
Toto je skript, který jsem použil:
*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh
Může mi prosím někdo pomoci?
Přijatá odpověď:
Neuvedli jste, jak jste svůj cronjob přidali. To je velký rozdíl:pokud jste použili crontab -e
v rámci vašeho vlastního účtu jsou skripty spouštěny s vaším uživatelem (a proto má položka crontab o jedno pole méně — uživatel, který jej má spustit, jak známo). Pokud jste jednoduše zkopírovali výše uvedený fragment do /etc/cron.d
, selhal by, protože jste nezadali uživatele (nebo spíše nenašel žádného uživatele s názvem „bash“). Měli byste tedy provést následující kroky:
- aktualizujte svou otázku o informace o tom, jak jste přidali úlohu cron
- zkontrolujte systémové protokoly (
/var/log/syslog
; mohly by poukazovat na možné chyby) - přidejte nějaký výstup ladění do souboru
Backup.sh
skript, abyste zjistili, zda je spuštěn
Třetího bodu lze dosáhnout několika způsoby:
- přidejte
>>/tmp/testlog.log
na konec vaší položky crontab (pro přesměrování výstupu do souboru, který můžete prozkoumat; navíc2>&1
by zahrnoval výstup z chybové konzoly) - přidejte do samotného skriptu několik řádků, např.
echo "Backup.sh started">/tmp/testlog.log
Navíc:Jak chcete, aby byl váš skript spouštěn pomocí bash
, neměli byste mu říkat, aby používal /bin/sh
(což by znamenalo použití dash
na výchozí instalaci Ubuntu), ale spíše /bin/bash
. Poté jej udělejte spustitelným a můžete dokonce vynechat „bash“ ze svého záznamu crontab.
Aktualizace:
Podle vašeho komentáře k mé odpovědi jste použili crontab -e
vytvořit úlohu a podle vašich systémových protokolů se provede, ale definice je spíše
*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh &>/dev/null
To přesměruje veškerý výstup do největšího úložiště ve vašem systému, „černé díry“:/dev/null
sní všechno (ale nikdy nic nevrátí). Přesměrování STDOUT a STDERR tímto způsobem vás připraví o jakékoli chybové hlášení — takže nikdy nevíte, že k nim vůbec došlo, natož podrobnosti. Pro testování byste měli vynechat &>/dev/null
část úplně. I když to funguje, měli byste pouze potlačit zbytečný výstup – jinak nikdy nevíte, kdy se něco pokazí. Takže je lepší vynechat alespoň ampersand, aby Cron mohl nahlásit jakékoli vyskytující se chyby.
Dále:Jakmile je výstup přesměrován (jako ve vašem případě na /dev/null
), připojení dalšího přesměrování na konec nepřinese žádné výsledky, protože vše je již pryč. Musím tedy upravit výše uvedenou radu z „přidat… na konec vašeho záznamu v crontabu“ na „nahraďte to ve vašem záznamu v crontabu“ 😉