Entendre el programador de tasques de linux (CRON)

El programador de tasques per exelència al mon linux és l’anomenat CRON. Aquest és un servici (dimoni) que està presenc a totes les distribucions de linux (crec que és així). Jo no vaig a extendre’m molt explicant cóm funciona ja que es pot complicar bastant la configuració que es vulga aplicar en l’execució d’una tasca (que si vull que s’executi cada 10 minuts de tal a tal hora i sols tal i tal dia de la setmana….). Sols vaig a explicar breument cada columna i possibles configuracions.

Per a poder editar el fitxer de configuració del cron s’executa l’ordre
sudo crontab -e
L’editor és un editor en mode text. Igual hi ha alguna ordre ja posada o no, però siga com siga explique les columnes que hi ha:

# Exemple de definició de cron:
# .---------------- minut (0 - 59)
# | .------------- hora (0 - 23)
# | | .---------- dia del més (1 - 31)
# | | | .------- mes (1 - 12) O jan,feb,mar,apr ...
# | | | | .---- dia de la setmana (0 - 6) (diumenge=0 or 7)
# | | | | |
# * * * * * comandament

  • En la primera columna indiquem a quin minut volem que s’execute.
  • En la segon columna indiquem a quina hora volem que s’execute.
  • En la tercera columna indiquem quin dia del mes volem que s’execute el comandament.
  • En la quarta columna indiquem en quin mes volem que s’execute.
  • En la quinta columna indiquem en quin dia volem que s’execute (0 = diumenge, 1 = dilluns,…, 6 = dissabte, 7 = diumenge).
  • En l’última columna indiquem qué volem executar.

El caràcter comodí * indica que no es definix res en eixa columna i sols s’admet en les primeres cinc columnes
Si volem posar varies unitats de temps en una mateixa columna, per exemple que s’execute a les 12 i a les 19, separarem els valors per una ‘,‘: 12,19
Si volem indicar un rang de valors consecutius (que s’execute a cada hora des de la 1 fins a les 5) utilitzarem el ‘‘:1-2
Si volem indicar “executar cada X temps”, utilitzarem el ‘/‘ per exemple executar cada 5 minuts: */5

Un exemple de com complicar la cosa seria aquest:
0-30/5 9,12 1-7 * 1 Executar durant 5 minuts els primers 30 minuts de les 9 i les 12 del primer dilluns de cada mes

  • A la primera columna indiquem primer el rang de temps en minuts (0-30) i després que volem que s’execute cada 5 minuts (/5).
  • A la segona columna li indiquem que s’execute a les 9 i les 12 (9,12).
  • A la tercera columna li indiquem que s’execute del dia 1 al 7 del mes.
  • La quarta la deixem al caracter comodí, que significa ‘per a qualsevol’ mes.
  • La quinta columna li indiquem que volem que s’execute el dilluns, aquesta columna condiciona a la tercera columna fent que sols s’execute quan coincideixquen les 2 columnes (dia del mes entre 1 i 7 i que ademés siga dilluns).

Com es pot observar… es pot complicar. Aquest exemple l’he tret de la xarxa i l’he complicat un poc més

I ara un exemple un poc més pràctic:
30 18 * * * rm /home/someuser/tmp/*

(tots els dies a les 18:30 es borra el contingut de la carpeta /home/someuser/tmp)

Ah! pel que he pogut observar, abans també existia 2 columnes més on s’indicava l’usuari i l’any que es volia executar. Ara ja no apareixen i si es vol programar alguna tasca com a usuari X el que es fa és fer un crontab -e en la sessió d’aquest usuari

http://www.adminschoice.com/crontab-quick-reference
http://www.pantz.org/software/cron/croninfo.html
http://www.nncron.ru/help/EN/working/cron-format.htm

Configurar RSYNC III

Bones!

Ara explicaré com poder automatitzar el rsync tant si s’utilitza el protocol rsync com si s’utilitza el del ssh. Com en les altres publicacions primer explique la part menys laboriosa i després la resta.

Protocol RSYNC

Per a poder fer un rsync sense que ens demane el password el que farem és guardar eixe password en un fitxer i passar-li aquest fitxer com a paràmetre al rsync:
echo el_meu_password > /ruta/password.meu
chmod 700 /ruta/password.meu

I ara a l’ordre que he utilitzat en les altres entrades afegim – -password-file /ruta/password.meu
rsync -avz --password-file /ruta/password.meu /ruta/oritge rsync://backup_user@servidor_destí:port/BACKUP
Fent que no ens demane cap password, el que tindrem clar és que al fitxer password.meu sols té accés l’usuari owner i que l’ordre s’executarà des d’aquest usuari ja que sino no podrà accedir al fitxer a llegir el password

Protocol SSH

Per a aquest protocol, com realment és una capa que es posa baix del RSYNC, utilitzarem tant l’opció del password de rsyn com el que anem a fer ara.

Realment el que es fa és generar en el pc client una clau parell privada – pública i passar-li al pc servidor de backup la clau pública, així quan el pc client intente connectar-se al servidor aquest comprovarà que és una connexió fiable (fiable perquè nosaltres li hem indicat abans que confie en aquesta clau).

PC Client

Generem una nova clau, aquesta clau es generarà amb l’usuari el qual executarà el backup (que pot ser diferent al que indiquem al servidor SSH):
ssh-keygen -b 4096 -t rsa
Li donem permisos totals sols al owner del fitxer de la clau privada (molt important ja que la clau privada d’un usuari sols la té que tindre eixe usuari.
chmod 700 /ruta/de/la/clau/generada/id_rsa
I finalment copiem la clau pública al servidor, normalment es copia a la carpeta .ssh de l’usuari amb el qual es connecta al servidor:
scp /ruta/de/la/clau/generada/id_rsa.pub @:/home//.ssh/
Fixeu-se que estem passant la clau id_rsa.pub (pública) i no la id_rsa (privada).

PC Servidor

En aquest pc el que anem a fer és incloure aquesta clau pública al fitxer d’autoritzacions anomenat authorized_keys. Aquest arxiu per defecte no està creat, així que primer el crearem:
touch /home//.ssh/authorized_keys
I després importem des del fitxer de la clau pública a aquest fitxer el contingut de la clau pública:
cat /home//.ssh/id_rsa.pub >> /home//.ssh/authorized_keys

Amb aquesta acció el que hem definit és que quan el servidor detecte un intent de connexió via ssh des d’un altre equip el qual tinga la clau privada corresponent a la clau pública definida en authorized_keys, aquest acceptarà la connexió sense demanar password ja que explícitament li hem indicat que és de fiar. Per això la importància de fer el chmod 700 a la clau privada al pc client per a prevenir que no ‘furten’ aquest fitxer i el posen en altres màquines o en altres usuaris.

Ara per a poder executar des del pc client el rsync via SSH sols cal executar la següent línia:
$rsync -avz --password-file /ruta/password.meu --rsh 'ssh -p port -l user_ssh' --rsync-path="sudo rsync" /ruta/oritge backup_user@servidor_destí::BACKUP

El que s’ha afegit a l’ordre del rsync via ssh és simplement el – -password-file /ruta/password.meu per a que rsync no demane password. Recordeu el que explique en aquest post sobre aquest tema, que executant aquesta odre s’introdueixen dos contrasenyes diferents: una correspon a ssh i l’altra al rsync. Doncs be, la del ssh no fa falta definir-la perquè ja l’hem definit amb el parell de claus privada – pública i s’aplica a qualsevol connexió ssh que fem (sftp, ssh, rsync per ssh,…) mentre tingam la clau privada al nostre usuari. Aleshores sols definim la introducció de la contrasenya rsync com hem fet amb el primer exemple.

Com se m’ha fet bastant extens aquest post (com sempre!) deixaré un altre post per a explicar com automatitzar les còpies de backup.

http://blog.desdelinux.net/ssh-sin-password-solo-3-pasos/
http://www.ubuntufacil.com/2014/01/generar-y-anadir-claves-ssh-para-acceso-sin-contrasenia/