Az Ubuntu Linux rendszerek esetében az automatizált feladatok ütemezése gyakran a cron segítségével történik. Ez lehetővé teszi, hogy bizonyos parancsok előre meghatározott időpontokban fussanak le emberi beavatkozás nélkül. Azonban előfordulhat, hogy egy parancs a terminálból történő futtatáskor megfelelően működik, míg cron job-ból nem az elvárt eredményt adja.
Ebben a cikkben egy konkrét példán keresztül nézzük meg, hogy mi okozhat problémát az rsync használata során egy automatikusan futtatott cron job esetében, és hogyan lehet ezt kijavítani.
Probléma: cron job-ból futtatva az rsync hibásan működik
A következő parancsot szeretnénk automatikusan futtatni cron job-bal egy biztonsági mentéshez:
cd / && rsync -aAXv --delete-during --exclude={"/mnt/**","/dev/","/proc/","/sys/","/tmp/","/run/"} / /mnt/masikparticio/
Ha ezt a parancsot közvetlenül a terminálból futtatjuk, akkor minden rendben működik, és az rsync figyelmen kívül hagyja az /mnt
könyvtár tartalmát. Azonban amikor a webmin felületén keresztül cron job-ként indítjuk, akkor az rsync a /mnt/masikparticio
mappába elkezdi önmagát másolni, figyelmen kívül hagyva a kizárásokat.
Lehetséges okok és megoldások
Az ilyen jellegű problémák több okra is visszavezethetők. Nézzük meg a leggyakoribbakat és a megoldásokat:
1. A cron job környezeti változói eltérnek a termináltól
A cron job-ok gyakran nem ugyanazzal a környezeti változó beállítással futnak, mint amit egy interaktív terminálban használunk. Ez problémát okozhat bizonyos parancsok végrehajtásánál.
Megoldás: Érdemes a teljes elérési utat megadni az rsync és más parancsok számára. Az which rsync
paranccsal ellenőrizhetjük az rsync helyét, például:
/usr/bin/rsync
Ennek megfelelően a cron job-ot így érdemes módosítani:
cd / && /usr/bin/rsync -aAXv --delete-during --exclude={"/mnt/**","/dev/","/proc/","/sys/","/tmp/","/run/"} / /mnt/masikparticio/
2. A cron job nem root felhasználóval fut
Ha az rsync parancsot terminálból root-ként futtatjuk, de a cron job más felhasználóval indul, akkor a jogosultsági különbségek miatt előfordulhat, hogy a parancs nem működik megfelelően.
Megoldás: Ellenőrizzük, hogy a cron job root-ként fut-e. Ha nem, akkor root jogosultsággal kell beállítani a crontab fájlt:
sudo crontab -e
Majd adjuk hozzá a következő bejegyzést:
0 3 * * * /root/biztonsagimentes.sh
3. A cron job naplófájlokban történő ellenőrzése
Ha továbbra sem működik megfelelően, érdemes megnézni a cron job naplóit. Ehhez a következő parancsot használhatjuk:
grep CRON /var/log/syslog
Ez megmutatja, hogy a cron milyen üzeneteket hagyott a naplóban a feladat futtatásával kapcsolatban.
4. A legjobb megoldás: shell script használata
Végül egy másik hatékony megoldás az, hogy nem közvetlenül a cron job-ból futtatjuk az rsync parancsot, hanem egy külön shell scriptet készítünk, amelyben biztosítjuk, hogy minden szükséges környezeti változó és jogosultság megfelelő legyen.
Készítsünk egy új fájlt:
nano /root/biztonsagimentes.sh
Majd másoljuk bele a következő tartalmat:
#!/bin/bash # Rsync biztonsági mentés cd / /usr/bin/rsync -aAXv --delete-during --exclude={"/mnt/**","/dev/","/proc/","/sys/","/tmp/","/run/"} / /mnt/masikparticio/
Ezután tegyük futtathatóvá a fájlt:
chmod +x /root/biztonsagimentes.sh
Majd állítsuk be a cron job-ot, hogy ezt a fájlt futtassa:
0 3 * * * /root/biztonsagimentes.sh
Összegzés
Ha egy rsync alapú biztonsági mentés terminálból megfelelően működik, de cron job-ból futtatva problémák jelentkeznek, annak több oka lehet:
- A cron környezeti változói eltérhetnek.
- A parancs nem root-ként fut.
- A naplókban található hibaüzenetek segíthetnek azonosítani a problémát.
- A legjobb megoldás egy külön shell script készítése.
Ha a fenti lépéseket követjük, biztosíthatjuk, hogy az rsync mentés mindig megfelelően fusson le, függetlenül attól, hogy terminálból vagy cron job-ból indítjuk.