Cron & crontab, explicado

Lucas publicado hai un tempo excelente titorial sobre cron e crontab iso creo que paga a pena compartilo. Cron é unha especie de equivalente ás Tarefas programadas en Windows, só que se manexa desde o terminal. Quen prefire unha interface visual para acadar o mesmo obxectivo, pode velo outro artigo.

Que é cron?

O nome cron vén do grego chronos que significa "tempo". No sistema operativo Unix, cron é un xestor de procesos de fondo regular (daemon) que executa procesos ou scripts a intervalos regulares (por exemplo, cada minuto, día, semana ou mes). Os procesos que se deben executar e o momento en que deben executarse están especificados no ficheiro crontab.

como funciona

O demonio cron comeza desde /etc/rc.d/ o /etc/init.d dependendo da distribución. Cron execútase en segundo plano, verifica a táboa de tarefas crontab cada minuto / etc / crontab o en / var / spool / cron na procura de tarefas a realizar. Como usuario podemos engadir comandos ou scripts con tarefas para cron para automatizar algúns procesos. Isto é útil por exemplo para automatizar a actualización dun sistema ou un bo sistema de copia de seguridade.

Artigo relacionado:
Titorial: instala os paquetes .tar.gz e .tar.bz2

Que é Crontab?

Crontab é un ficheiro de texto sinxelo que almacena unha lista de comandos a executar nun momento especificado polo usuario. Crontab comprobará a data e a hora en que se debe executar o script ou o comando, os permisos de execución e farano nun segundo plano. Cada usuario pode ter o seu propio ficheiro crontab, de feito o / etc / crontab suponse que é o ficheiro crontab do usuario root, cando os usuarios normais (e incluso root) queren xerar o seu propio ficheiro crontab entón usaremos o comando crontab.

Crontab é o xeito máis sinxelo de xestionar tarefas cron en sistemas multiusuarios, xa sexa como un usuario do sistema ou como usuario root.

Usando crontab

Comezamos cun exemplo sinxelo.

Imos automatizar a actualización dun sistema, para eliminar o molesto de "Sempre teño que actualizar e iso non me gusta!"

como
Artigo relacionado:
Comandos para coñecer o sistema (identificar hardware e algunhas configuracións de software)

Primeiro de todo faremos un guión. Este script será chamado por cron e conterá todas as instrucións que queremos que faga, polo que é necesario probalo en varios casos e de varias maneiras antes de incluílo en cron, un sinxelo script de actualización coma este:

#! / bin / bash # exemplo de actualización de scripts #elixe a túa distribución # debian-ubuntu # apt-get update & apt-get -y upgrade #fedora #yum -y update #Arch #pacman --noconfirm -Syu

Elimina o # da túa liña de distro. No caso de que sexa Ubuntu / Debian, comeza con apt-get.

Gardamos o script como update.sh (por exemplo, o directorio de scripts na súa casa). Cambiamos os permisos de execución do devandito script con:

chmod a + x ~ / scripts / update.sh

Executamos o script un par de veces para comprobar que todo funciona correctamente, modificamos o necesario (non debe conter erros, se non, cron só repetirá un erro unha e outra vez). Agora engade a tarefa ao noso crontab.

Engade tarefas a crontab

Executamos a edición do crontab con crontab -e, nalgunhas distros (como Ubuntu) dános a opción de escoller o editor de texto que queiramos, o resto quedámonos con vi. O ficheiro crontab terá un aspecto así.

Comando de usuario # mh dom mon dow

onde:

  • m corresponde ao minuto no que se executará o script, o valor oscila entre 0 e 59
  • h a hora exacta, trátase o formato de 24 horas, os valores varían de 0 a 23, sendo 0 a 12:00 da medianoite.
  • don refírese ao día do mes, por exemplo, pode especificar 15 se quere executarse cada 15 días
  • abaixo significa o día da semana, pode ser numérico (do 0 ao 7, onde o 0 e o 7 son domingo) ou as 3 primeiras letras do día en inglés: luns, martes, mércores, xoves, venres, sábados, sol.
  • usuario define o usuario que executará o comando, pode ser root ou un usuario diferente sempre que teña permisos para executar o script.
  • mando refírese ao comando ou ao camiño absoluto do script a executar, exemplo: /home/usuario/scripts/update.sh, se chama a un script, debe ser executable

Para ter claros algúns exemplos de tarefas cron explicadas:

15 10 * * * usuario /home/user/scripts/update.sh

Executará o script update.sh ás 10:15 da mañá todos os días

15 22 * * * usuario /home/user/scripts/update.sh

Executará o script update.sh ás 10:15 horas todos os días

00 10 * * 0 root apt-get -y update Usuario raíz

Actualizarase todos os domingos ás 10:00 horas

45 10 * * Sun root apt-get -y update

O usuario raíz executará unha actualización todos os domingos (dom) ás 10:45 da mañá

30 7 20 11 * usuario /home/usuario/scripts/update.sh

O 20 de novembro ás 7:30 o usuario executará o script

30 7 11 11 sun user /home/usuario/scripts/pastel_con_velitas.sh

O 11 de novembro ás 7:30 da mañá e é o domingo, o usuario celebrará o seu administrador de sistemas (é dicir, eu)

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

Un molesto recordatorio cada minuto de cada hora todos os días (NON recomendado).

Aínda se poden manexar gamas especiais:

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

Ás 5:30 da tarde todos os días de luns a venres.

00 12 1,15,28 * *

Ás doce do mediodía cada primeiro, quince e 12 de cada mes (ideal para nóminas)

Se isto é confuso, os controladores crontab cadeas especiais para definir estes rangos.

@reboot Executa unha vez, ao iniciar
@yearly só funciona ao ano: 0 0 1 1 *
@ anualmente igual que @anualmente
@ mensualmente execútase unha vez ao mes, o primeiro día: 0 0 1 * *
@weekly Weekly o primeiro minuto da primeira hora da semana. 0 0 * * 0 ″.
@ diario a diario, ás 12:00 a.m. 0 0 * * *
@midnight igual que @daily
@hourly no primeiro minuto de cada hora: 0 * * * *

O seu uso é moi sinxelo.

@ usuario por hora /home/user/scripts/molestorecordatorio.sh @ usuario mensual /home/user/scripts/backup.sh @daily root apt-get update && apt-get -y upgrade

Por último, pero non menos importante:

Xestión de postos de traballo Cron

ficheiro crontab

Substitúe o ficheiro crontab existente por un ficheiro definido polo usuario

crontab -e

Edite o ficheiro crontab do usuario, cada nova liña será unha nova tarefa crontab.

crontab -l

Enumere todas as tarefas crontab do usuario

crontab -d

Elimina o crontab do usuario

crontab -c dir

Define o directorio crontab do usuario (debe ter os permisos de escritura e execución do usuario)

usuario crontab -u

prefixo para tratar o crontab doutro usuario, exemplos:

$ sudo crontab -l -u root $ sudo crontab -e user2 #crontab -d -u user

Esta ferramenta, como moitas outras, pódese ver con máis profundidade e detalle en:

Grazas Lucain!

O contido do artigo adhírese aos nosos principios de ética editorial. Para informar dun erro faga clic en aquí.

48 comentarios, deixa os teus

Deixa o teu comentario

Enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados con *

*

*

  1. Responsable dos datos: Miguel Ángel Gatón
  2. Finalidade dos datos: controlar SPAM, xestión de comentarios.
  3. Lexitimación: o seu consentimento
  4. Comunicación dos datos: os datos non serán comunicados a terceiros salvo obrigación legal.
  5. Almacenamento de datos: base de datos aloxada por Occentus Networks (UE)
  6. Dereitos: en calquera momento pode limitar, recuperar e eliminar a súa información.

  1.   Álvaro Ortiz dixo

    Uf ... un pouco confuso.

  2.   tonico dixo

    * / 30 falta (no campo de minutos) que se executa cada 30 minutos ...

    1.    erm3nda dixo

      Só isto ía comentalo ata que decidín revisar os comentarios 😀
      Este modificador é unha información moi importante e algo moi útil.

      1.    Kika dixo

        Ola!
        Agora mesmo estou probando unha configuración cada 45 minutos.

        * / 45 * * * *, e a instrución execútase aos 45 minutos de cada hora E cada hora. É dicir:

        Funciona ás 3:45, despois ás 4:00, ás 4:45, despois ás 5:00, ás 5:45, ás 6:00, ás 6:45, etc.

        Teño algo mal? Que podo facer para que só sexa cada 45 minutos ou polo menos unha vez aos 45 minutos cada hora.

    2.    Kika dixo

      Ola!
      Agora mesmo estou probando unha configuración cada 45 minutos.

      * / 45 * * * *, e a instrución execútase aos 45 minutos de cada hora E cada hora. É dicir:

      Funciona ás 3:45, despois ás 4:00, ás 4:45, despois ás 5:00, ás 5:45, ás 6:00, ás 6:45, etc.

      Teño algo mal? Que podo facer para que só sexa cada 45 minutos ou polo menos unha vez aos 45 minutos cada hora.

  3.   Neglixente dixo

    Ola, moi útil a información para aclarar o funcionamento do cron.
    Bytes

  4.   Neglixente dixo

    co propósito de *

  5.   cazador dixo

    Excelente, grazas por aclarar como funciona o cron .. poñamos un pouco a man 🙂

  6.   Jacob dixo

    Esta liña, segundo teño entendido, executarase ás 10:15 horas. Corrixe se me equivoco
    Ben, alí di as 10:15 da mañá
    15 22 * * * usuario /home/user/scripts/update.sh

  7.   Agustin dixo

    Ola! moi boa información.
    Para executar un script cada media hora, a liña que se debería engadir a CronTab sería: "30 * * * * root Scrip.sh" ¿Correcto? Moitas grazas!

  8.   usemos linux dixo

    Non. Se non recordo mal, para iso tes que poñer / 30 * * * * root Scrip.sh.
    É dicir, engade o / antes do 30.
    Ánimo! Paul.

  9.   Jonathan dixo

    Ola gustoume a túa publicación, é moi completa pero quería preguntarche algo.
    Estou tendo problemas con este comando e outro como "at".

    Quero executar un script nun momento determinado e poñer

    en -f /home/mi_user/Desk/script.sh 18:08 exemplo

    e o script non se executa na pantalla, quero dicir no terminal, execútase en segundo plano?

    E con cron pásame o mesmo, edito o ficheiro crontab con "crontab -e"

    ao final engado esta liña:

    46 19 my_user /home/mi_user/Desk/script.sh

    e non fai nada, non mostra o guión.

    Algunha suxestión? Moitas grazas e desculpade as molestias

    1.    usemos linux dixo

      Para que apareza o terminal, pode que teña que executalo e pasar o script como parámetro.

      Por exemplo:

      lxterminal -e "my_user /home/mi_user/Desktop/script.sh"

      O parámetro a usar pode variar en función do emulador de terminal que use.

      Espero que funcione.

      Abrazo! Paul.

  10.   patrecas dixo

    Agradécese a contribución.

    10 puntos!!

    saúdo 2!!

  11.   Rodolfo dixo

    Moitas grazas, axudoume moito a aclarar algunhas cousas, grazas totais, por máis detalles ou preguntas dirixireime á PÁXINA DO HOME, reiterados saúdos.

  12.   xahir dixo

    home moitas grazas, estiven lendo e probando os exemplos. moitas grazas ... é moi comprensible. Graciñas

  13.   xeovanni dixo

    Eu usei ubuntu Server 12.04.2 LTS, e a versión de crontab que teño, para eliminar a lista de traballos do usuario, crontab -r (e -l, como di este manual). Claro que se trata de versións.

    Por outra banda, unha vez executei só crontab e este tipo deixoume crear o meu propio ficheiro de execución, pero este non foi o que se estaba executando. O que se executa é o de / etc / crontab. quizais alguén empregue o comentario.

    PS (busquei localizar e onde está crontab pero só devolveu o enderezo mencionado e outro ficheiro cifrado, polo que se o que se executou era o de / etc / crontab, pero ao executar o comando crontab -e aparecería o meu con todos os traballos que definira) onde se almacenaba este ficheiro? Saúdos. Sempre accedo con root.

  14.   Sebastian dixo

    Excelente, moi útil !!!

  15.   mmm dixo

    Ola, gustaríame facelo ………… «15 10 * * * root ifdown eth0»

    é dicir, que nun momento determinado a tarxeta de rede está apagada ...... ben, púxena no crontab e non funcionou ...... ¿que pasa?

    Saúdos e grazas

  16.   Miguel dixo

    Faltou a definición de "mon" despois do título "Engadir tarefas a crontab"

    O artigo segue sendo bo, cron é extremadamente útil.

  17.   Oscar dixo

    Que chulo foi ese bo post, pregúntame
    Se quero facer un seguimento dos rexistros que deixou a execución das tarefas, onde podo velo?

    é decidir quero ver o historial das accións feitas no pasado deste ficheiro e quero ver quen o modificou e a data

    grazas

  18.   oscar dixo

    Quero comprobar o historial de modificacións desta

    como podo facelo?

    grazas

  19.   Andrés Ledo dixo

    Bo día,

    Creo que no script de Ubuntu cometeu un erro, puxo actualización ap-get -y en vez de apt-get -y upgrade. (Deixaches unha t).

    Un saúdo.

    1.    usemos linux dixo

      Tamén o é. Grazas!
      Abrazo! Paul

  20.   Gabriel dixo

    Quero saber como crear un ficheiro cron para poder especificar a hora en que se executa, o directorio, etc.

  21.   Valentin dixo

    Grazas por aclarar o funcionamento e os comandos básicos para cron, agora para divertirse un pouco.

  22.   Sander dixo

    Sempre que busco información sobre calquera tema relacionado con Gnu / Linux dou voltas e voltas para atopar no 90% dos casos o mellor tutorial desta gran comunidade, creo que a partir de agora comezarei aquí e logo noutros lugares.

    lembranzas

    1.    usemos linux dixo

      Grazas Sander! Unha aperta! Paul.

  23.   dario dixo

    dom = día do mes
    dow = día da semana
    é máis doado se asocias

  24.   Pascual dixo

    Moitas grazas, isto é moi completo e está ben explicado.

  25.   Maxilar dixo

    Isto é o mesmo que nos deu o meu profesor de SO, non cambio nada, agora vexo por que a clase é tan mala .- Ben, isto é o mesmo que os deberes xD

  26.   Marcelo dixo

    Querido,

    Consulta, pódese limitar a duración dunha tarefa?
    Por exemplo, teño unha tarefa que se repite cada 5 minutos, se se repite se esta tarefa aínda está activa, mátaa e volve executala.

    Grazas,
    Marcelo.-

    1.    usemos linux dixo

      Ola, Marcelo!

      Creo que sería mellor que formulase esta pregunta no noso servizo de preguntas e respostas chamado Pregunta a Linux para que toda a comunidade poida axudarche co teu problema.

      Unha aperta, Pablo.

  27.   aj dixo

    bo post.
    Cal é o comando por terminal para engadir tarefas ao crontab (sen entrar no crontab e engadilas manualmente por 'crontab -e' ou substituír o crontab por outro crontab por 'ficheiro crontab').
    A idea é crear un script externo para engadir as tarefas ao crontab
    grazas

    1.    david dixo

      paréceme que podería usar "eco" o que queira engadir "| cat >> 'ruta cronotab (/ etc / cronotab)' «

  28.   Rafael Vera dixo

    Como se executaría unha expresión cada 3 días exactamente

  29.   José Antonio dixo

    Olá

    Teño un problema ao executar un traballo cron.

    Realizo a seguinte tarefa con cronta -e:

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

    pero a tarefa non está feita. Comprobei que myfile.sh ten permiso de execución e que o usuario que o executa é root.

    Executo a mesma tarefa en / etc / crontab e despois de reiniciar o servizo, tampouco me funciona.
    O contido de myfile.sh é un comando que actualiza unha base de datos e se a executo na consola funciona.
    algunha idea de cal pode ser o problema?

    1.    fredd dixo

      É posible que o usuario da base de datos non teña todos os permisos e primeiro terá que exportar as variables de entorno dende o seu motor de base de datos.
      Por exemplo, en db2 esta liña iría ao comezo do script
      . / home / db2inst1 / sqllib / db2profile

      Outra causa pode ser que o script require conexión coa base de datos, faga a conexión coa base de datos dentro do script

  30.   LA3 dixo

    Non sabía que tiña que reiniciar o crond, levaba tempo loitando con isto

  31.   Kenia dixo

    Saberán como indicar que a tarefa se executa cada fin de mes, á hora indicada .. o detalle é que non podo conseguir como sei que tardará o último día de cada mes .. ??? Tiven que anotalos un por un pero cando chega o final do mes de febreiro que é biciesto é complicado para min.

  32.   Xesús dixo

    bo día!!

    Como podo parar o proceso que se está a executar no crontab?

  33.   Xesús dixo

    proceso * …………

  34.   Julianna dixo

    ¿Pode ser que me poida axudar? eu tenho um script de minha authored that does not work no crontab! De todos os permisos, non hai ningún cron ou usuario privado que poida executalo, a maioría non pasa nada. Gustaríame saber se me podes axudar, algunhas outras cousas non funcionan. Vlws

  35.   Anthox dixo

    Como poñerías unha tarefa para executarse todos os últimos días do mes (días: 31-30-28)?

  36.   tfercho dixo

    Como xa sabes, o comando su úsase para cambiar de usuario nunha consola. Se uso o comando su así: "o teu usuario" cambia de usuario pero sen a configuración adecuada de "usuario", se executo su como: "o seu" usuario cambia o usuario cargando a configuración do usuario. Con cron indico o usuario, pero como cargo as configuracións deste usuario?

  37.   Roubar dixo

    E se quero paralo?

  38.   rex dixo

    Ola,
    Non sei que fago mal, pero sigo os pasos e non se executa nada. Intentei:
    59 * * * * / usr / bin / gedit
    * * * * * / usr / bin / gedit
    * * * * * root / usr / bin / gedit
    * * * * * usr / bin / test.sh
    * * * * * root usr / bin / test.sh

    e nada de nada. Non executa nada. Reiniciou e todo.

  39.   Ferqos dixo

    moitas grazas