Cron & crontab, explicats

Lucan publicar fa ja un temps, un excel·lent tutorial sobre cron i crontab que em sembla val la pena compartir. Cron és una mena d'equivalent a Tasques Programades a Windows, Només que es maneja des del terminal. Aquells que prefereixin una interfície visual per aconseguir el mateix objectiu, poden veure aquest un altre article.

Què és cron?

El nom cron ve de el grec chronos que significa "temps". En el sistema operatiu Unix, cron és un administrador regular de processos en segon pla (dimoni) que executa processos o guions a intervals regulars (per exemple, cada minut, dia, setmana o mes). Els processos que s'han d'executar i l'hora en què han de fer s'especifiquen en el fitxer crontab.

Com funciona

El dimoni cron s'inicia d' /etc/rc.d/ o /etc/init.d depenent de la distribució. Cron s'executa en el background, revisa cada minut la taula de tasques crontab / Etc / crontab o en / Var / spool / cron en recerca de tasques que s'hagin de complir. Com a usuari podem afegir ordres o scripts amb tasques a cron per automatitzar alguns processos. Això és útil per exemple per automatitzar l'actualizacion d'un sistema o un bon sistema de respatllers.

Article relacionat:
Tutorial: Instal·lar paquets .tar.gz i .tar.bz2

Què és Crontab?

Crontab és un simple arxiu de text que guarda una llista d'ordres a executar en un temps especificat per l'usuari. Crontab verificarà la data i hora en què s'ha d'executar l'script o la comanda, els permisos d'execució i el realitzarà en el background. Cada usuari pot tenir el seu propi crontab, de fet el / Etc / crontab s'assumeix que és el crontab de l'usuari root, quan la majoria de gent (i fins i tot root) volen generar el seu propi arxiu de crontab, llavors utilitzarem el comandament crontab.

Crontab és la manera més senzilla d'administrar tasques amb cron en sistemes multiusuari, ja sigui com a simple usuari de sistema o usuari root.

utilitzant crontab

Anem començant amb un exemple simple.

Anem a automatitzar l'actualització d'un sistema, per eliminar la molesta de "sempre he de caminar actualitzant i això no m'agrada!".

com
Article relacionat:
Ordres per conèixer el sistema (identificar maquinari i algunes configuracions de programari)

Primer que res farem un script. Aquest script serà cridat per cron i contindrà totes les instruccions que volem que faci, per tant cal provar-ho en diversos casos i de diverses formes abans d'incloure-a cron, un senzill script d'actualització com aquest:

#! / Bin / bash #script exemple d'actualizacion #elija seva distribució # debian-ubuntu # apt-get update & apt-get -i upgrade #fedora #yum -i update #Arch #pacman --noconfirm -Syu

Treu-li el # a la línia de la teva distro. En cas que sigui Ubuntu / Debian, a la qual comença amb apt-get.

Guardem l'script com actualizacion.sh (ex. Directori scripts teu home). Canviem els permisos d'ejecucion de el maleït script amb:

chmod a + x ~ / scripts / actualizacion.sh

Executem l'script un parell de vegades per verificar que tot s'executi sense problemes, modifiquem el necessari (no ha de contenir errors, si no cron només repetirà un error una i altra vegada). Ara a afegir la tasca al nostre crontab.

Afegir tasques a crontab

Executem l'edició de l'crontab amb crontab -e, en algunes distros (com Ubuntu) ens dóna l'opció de triar l'editor de textos que desitgem, els altres ens vam quedar amb vaig veure. L'arxiu crontab lluirà alguna cosa asi.

# Mh dg mon dow user command

on:

  • m correspon a el minut en què es va a executar el script, el valor va de 0 a 59
  • h l'hora exacta, es maneja el format de 24 hores, els valors van de 0 a 23, sent 0 les 12:00 de la mitjanit.
  • dg fa referència a el dia de el mes, per exemple es pot especificar 15 si es vol executar cada dia 15
  • Dow significa el dia de la setmana, pot ser numèric (0 a 7, on 0 i 7 són diumenge) o les 3 primeres lletres del dia en anglès: mon, tue, wed, thu, fri, sat, sun.
  • user defineix l'usuari que va a executar la comanda, pot ser root, o un altre usuari diferent sempre que tingui permisos d'execució de l'script.
  • comanda refereix a la comanda o la ruta absoluta de l'script a executar, exemple: /home/usuari/scripts/actualitzar.sh, Si de cas crida a un script aquest ha de ser executable

Perquè quedés clar uns quants exemples de tasques de cron explicats:

Octubre 15 * * * usuari /home/usuario/scripts/actualizar.sh

Executarà el script actualizar.sh a les 10:15 am cada dia

Octubre 15 * * * usuari /home/usuario/scripts/actualizar.sh

Executarà el script actualizar.sh a les 10:15 am tots els dies

00 10 * * 0 root apt-get -i update Usuari root

Realitzarà una actualització tots els diumenges a les 10:00 am

45 10 * * sun root apt-get -i update

Usuari root realitzarà una actualització tots els diumenges (sun) a les 10:45

Juliol 30 novembre 7 * usuari /home/usuario/scripts/actualizar.sh

El dia 20 de novembre a les 7:30 l'usuari correrà l'script

Juliol 30 novembre 7 sun usuari /home/usuario/scripts/pastel_con_velitas.sh

El dia 11 de novembre a les 7:30 am i que sigui diumenge, l'usuari celebrarà el sysadmin (o sigui a mi)

01 * * * * usuari /home/usuario/scripts/molestorecordatorio.sh

Un molest recordatori cada minut de cada hora cada dia (NO recomanable).

Igual es poden gestionar rangs especials:

30 17 * * 1,2,3,4,5

A les 5:30 de la tarda tots els dies de dilluns a divendres.

00 12 1,15,28 * *

A les 12 del dia tots els dies primer, quinze i 28 de cada mes (ideal per a nòmines)

Si això resulta confús, crontab maneja cadenes especials per a definir aquests rangs.

@reboot Executa una vegada, a l'inici
@yearly executa només una vegada a l'any: 0 0 1 1 *
@annually igual que @yearly
@monthly executa un cop a el mes, el dia primer: 0 0 1 * *
@weekly Setmanal del primer minut de la primera hora de la setmana. 0 0 * * 0 ".
@daily diari, a les 12:00 a.m. 0 0 * * *
@mitjanit igual que @diari
@hourly a el primer minut de cada hora: 0 * * * *

El seu ús és molt senzill.

@hourly usuari /home/usuario/scripts/molestorecordatorio.sh @monthly usuari /home/usuario/scripts/respaldo.sh @daily root apt-get update && apt-get -i upgrade

Finalment i no menys important:

Administració de treballs en cron

crontab arxiu

Reemplaça l'existent crontab amb un arxiu definit per l'usuari

crontab -e

Edita el crontab de l'usuari, cada línia nova sera una nova tasca de crontab.

crontab -l

Llista totes les tasques de crontab de l'usuari

crontab -d

Esborra el crontab de l'usuari

crontab -c dir

Defineix el directoriod i crontab de l'usuari (aquest ha de tenir permisos d'escriptura i ejecucion de l'usuari)

crontab -u usuari

prefix per manejar el crontab d'un altre usuari, exemples:

$ Sudo crontab -l -o root $ sudo crontab -e usuari2 #crontab -d -o usuari

Aquesta eina, com moltes altres es poden veure a mes profunditat i amb més detall a:

Gràcies Lucain!

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   Alvaro Ortiz va dir

    Uf ... una mica embolicat.

  2.   tònic va dir

    falta el * / 30 (en el camp dels minuts) que executa cada 30 minuts ...

    1.    erm3nda va dir

      Just això comentaria jo fins que vaig decidir revisar els comentaris 😀
      És una dada molt important i una cosa molt útil aquest modificador.

      1.    TINA va dir

        Hola!
        En aquest moment estic provant una configuració cada 45 minuts.

        * / 45 * * * *, i la instrucció s'executa als 45 minuts de cada hora I cada hora. És a dir:

        S'executa a les 3:45, després a les 4:00, 4:45, després a les 5:00, 5:45, 6:00, 6:45, i així successivament.

        Tinc alguna cosa malament ?, què puc fer perquè sigui només cada 45 minuts, o almenys una sola vegada a les i 45 de cada hora.

    2.    TINA va dir

      Hola!
      En aquest moment estic provant una configuració cada 45 minuts.

      * / 45 * * * *, i la instrucció s'executa als 45 minuts de cada hora I cada hora. És a dir:

      S'executa a les 3:45, després a les 4:00, 4:45, després a les 5:00, 5:45, 6:00, 6:45, i així successivament.

      Tinc alguna cosa malament ?, què puc fer perquè sigui només cada 45 minuts, o almenys una sola vegada a les i 45 de cada hora.

  3.   Fluix va dir

    Hola super útil la informació parell aclarir com funciona cron.
    Bytes

  4.   Fluix va dir

    per *

  5.   caçador va dir

    Excel·lent, gràcies per aclarir-me com funciona cron .. anem a ficar una mica de mà 🙂

  6.   Jacob va dir

    Aquesta línia segons entenc s'executés a les 10: 15:XNUMX corregeixin-me si m'equivoco
    doncs ahi diu 10:15
    Octubre 15 * * * usuari /home/usuario/scripts/actualizar.sh

  7.   Agustín va dir

    Hola! molt bona info.
    per executar un Script cada mitja hora la línia que caldria afegir a crontab seria: «30 * * * * root Scrip.sh» Correcte? Moltes Gràcies!

  8.   usemoslinux va dir

    No. Si no recordo malament, per a això has de posar / 30 * * * * root Scrip.sh.
    O sigui, afegir la / abans de l'30.
    Salutacions! Pau.

  9.   Jonathan va dir

    Hola em gust el teu post, aquesta molt complet però volia preguntar-te alguna cosa.
    Estic tenint problemes amb aquesta comanda i un de semblant «at».

    Vull executar un script a una hora determinada i poso

    at -f /home/mi_user/Escritorio/script.sh 18:08 exemple

    i no s'executa l'script en pantalla o sigui a la terminal, s'executa en 2on pla?

    I amb cron em passa el mateix, edito el crontab amb «crontab -e»

    a la fin li agrego aquesta línia:

    46 19 el meu_user /home/el meu_user/Escriptori/script.sh

    i no fa res, no mostra l'script.

    Algun suggeriment? Moltes gràcies i disculpa les molèsties

    1.    usemoslinux va dir

      Perquè et aparegui el terminal, potser hagis de executar el terminal i passar com a paràmetre l'script.

      Per exemple:

      LXTerminal -i «mi_user /home/mi_user/Escritorio/script.sh»

      El paràmetre a utilitzar pot variar sobre la base de l'emulador de terminal que utilitzis.

      Espero que serveixi.

      Abraçada! Pau.

  10.   patretques va dir

    S'agraeix l'aportació.

    10 punts !!

    salu2 !!

  11.   Rodolfo va dir

    Moltes gràcies, em va servir molt per aclarir algunes coses, gràcies totals, per a més detalls o dubtes aniré a la PÀGINA MAN, salutacions reiterats.

  12.   Jahir va dir

    tio moltes gràcies, he anat llegint i provant els exemples. moltes gràcies ... és molt comprensible. Salutacions

  13.   Geovanni va dir

    Jo va utilitzar Ubuntu Server 12.04.2 LTS, i la versio de crontab que tinc, per esborrar la llista de treballs de l'usuari s'utilitza, crontab -r (i -l, com diu aquest manual). Segur és per qüestió de versions.

    D'altra banda, jo en alguna vegada s'executi només crontab i això com que em deixo crear el meu propi arxiu d'execució, però aquest no era el que s'estava executant. El que s'executa és el que està en / etc / crontab. potser a algú li serveixi el comentari.

    PD (jo busqui amb locate i whereis crontab però només em retornava l'adreça abans esmentada i un altre arxiu que aquesta encriptat, llavors si el que s'executava era el de / etc / crontab, però a l'executar la comanda crontab -e em apareixia el meu amb tots els treballs que segons jo havia definit) on s'estava emmagatzemant aquesta imatge '???? salutacions. Sempre em logueo amb root.

  14.   Sebastian va dir

    Excel·lent, molt útil !!!

  15.   mmm va dir

    Hola, voldria fer això ............ «15 10 * * * root ifdown eth0»

    és a dir que a certa hora s'apagui la targeta de xarxa ............ doncs bé, el vaig posar al crontab i no funcinó ...... .. què ona ??

    Salutacions i gràcies

  16.   Miguel va dir

    Et va faltar definir «mon» després de l'títol «Afegir tasques a l'crontab»

    Igual està bonic l'article, cron és summament útil.

  17.   Òscar va dir

    Que chevere em va servir molt bon post pregunta
    Si vull fer seguiment als registres que deixa l'execució de tasques on el puc visualitzar?

    és decdir vull veure l'historial de les accions fetes en el passat d'aquest arxiu i vull veure qui l'ha modificat i la data

    gràcies

  18.   oscar va dir

    qualsevol verificar l'historial de modificacion d'aquest

    com ho puc fer

    gràcies

  19.   Andrés Ledo va dir

    Bon dia,

    Crec que en l'script d'ubuntu t'has equivocat, has posat ap-get -i upgrade en lloc d'apt-get -i upgrade. (T'has deixat una t).

    Una salutació.

    1.    usemoslinux va dir

      Així és. Gràcies!
      Abraçada! Pau

  20.   Gabriel va dir

    Vull saber com crear un arxiu cron per poder especificar el temps cada quan s'executa, el directori, etc.

  21.   Valentin va dir

    Gràcies per aclarir el funcionament i els comandaments bàsics per cron, ara a entretenir-se una rrato .-

  22.   Sander va dir

    Sempre que busco informació de qualsevol tema relacionat a GNU / Linux dono voltes i voltes per a al final sempre trobar en el 90% dels casos el millor tutorial en aquesta genial comunitat, crec que des d'ara començaré aquí i després per altres costats.

    Salutacions

    1.    usemoslinux va dir

      Gràcies Sander! Una abraçada! Pau.

  23.   donaro va dir

    dg = day of month
    dow = day of week
    és més fàcil si s'associa

  24.   Pascual va dir

    Moltes gràcies molt complet això i ben explicat.

  25.   Maxillia va dir

    Això és el mateix que ens va donar el meu professor de Sistemes Operatius no li canvi res, ara veig per que és tan dolenta la classe .-., Bé això mateix dóna re de tasca xD

  26.   Marcelo va dir

    Benvolgut,

    Consulta, es pot limitar el temps de durada d'una tasca?.
    Per exemple tinc una tasca que es repeteix cada 5 minuts, en la repetició si encara està activa aquesta tasca, que la mati i torni a executar-se.

    Gràcies,
    Marcelo.-

    1.    usemoslinux va dir

      Hola Marcel!

      Crec que seria millor que plantegis aquesta consulta al nostre servei de preguntes i respostes anomenat Demanar DesdeLinux per tal que tota la comunitat pugui ajudar-te amb el teu problema.

      Una abraçada, Pau.

  27.   aj va dir

    bon post.
    Quin és la comanda per terminal per afegir tasques a l'crontab (sense entrar a l'crontab i agregar manualment amb 'crontab -e' o reemplaçar el crontab per un altre crontab amb 'crontab arxiu').
    La idea és crear un script extern per agregar les tasques a l'crontab
    Gràcias

    1.    david va dir

      em sembla que podries fer servir «fet 'el que vulguis afegir' | cat >> 'ruta de l'cronotab (/ etc / cronotab)' «

  28.   Rafael Vera va dir

    com seria una expressió que s'executi cada 3 dies exactes

  29.   José Antonio va dir

    Hola.

    Tinc un problema a l'executar una tasca de cron.

    Jo va executar la següent tasca amb cronta -i:

    01 * * * * root /home/user/script/mifichero.sh

    però la tasca no es realitza. He comprabado que mifichero.sh tingui permís d'execució i que l'usuari que l'executi sigui root.

    La mateixa tasca va executar a / etc / crontab i després del reinici de l'servei, tampoc em funciona.
    El contingut d'mifichero.sh és una ordre que actualitza una BBDD i que si ho executo en consola si funciona.
    alguna idea de quin pot ser el problema?

    1.    fredd va dir

      És probable que l'usuari de base de dades no tingui tots els permisos i primer hagis de exportar les variables d'entorn del teu motor de base de dades.
      Per exemple en db2, aquesta línia aniria a l'començament de l'script
      . / Home / db2inst1 / sqllib / db2profile

      Una altra causa podria ser que l'script requereixi connexió a la base de dades, realitza la connexió a la base dins de l'script

  30.   LA3 va dir

    no sàvia que havia de reiniciar el crond, portava una estona barallant-me amb això

  31.   Kenya va dir

    sabran com indicar que la tasca es corri cada cap de mes, a l'hora que se li indiqui .. el detall és que no aconsegueixo com sàpiga que prengui l'últim dia de cada mes .. ??? vaig haver de anotar un per un però quan ve final de mes de febrer que és biciesto es em complica ..

  32.   Jesús va dir

    bon dia !!

    com detinc el proseso que s'està executant al crontab?

  33.   Jesús va dir

    procés * ............

  34.   Julianna va dir

    serб que vc podi em Ajudar? eu Tenho um script d'minha autoria que nгo funciona no crontab! jб dei totes es permissхes, no prуprio cron específic o usuбrio que podi executб-ho mes gens esdevé! Gostaria de saber es vc podi em Ajudar, pois outras coisas funcionam no cron! Vlws

  35.   Antox va dir

    com posaries una tasca perquè s'executa cada últim dia de mes (dies: 31-30-28)?

  36.   tfercho va dir

    Com ja saben la comanda la seva s'usa per canviar d'usuari en la consola. Si jo faig servir la comanda el seu així: «el seu usuari» canvi d'usuari però sense les configuracions pròpies de «usuari», si jo executo el seu as: «la seva - usaurio» canvia d'usuari carregant les configuracions de l'usuari. Amb cron indico l'usuari, però com a càrrec les configuracions d'aquest usuari?

  37.   Robar va dir

    I si vull detenir-??

  38.   Regi va dir

    Hola,
    no sé que estic fent malament, però segueixo els passos i no s'executa res. He provat:
    59 * * * * / usr / bin / gedit
    * * * * * / Usr / bin / gedit
    * * * * * Root / usr / bin / gedit
    * * * * * Usr / bin / prueva.sh
    * * * * * Root usr / bin / prueva.sh

    i res de res. No executa res. He reiniciat i tot.

  39.   Ferqos va dir

    moltes gràcies