¿Cómo puedo hacer que cron ejecute un trabajo ahora mismo, para pruebas / depuración? sin cambiar el horario!


135

Tengo un trabajo cron que está programado para ejecutarse todos los días, aparte de cambiar el horario, ¿hay alguna otra forma de hacer una ejecución de prueba del comando en este momento para ver si funciona según lo previsto?


No entiendo tu pregunta? ¿Por qué no simplemente ejecuta el comando?
favadi

21
Sé que el comando funciona cuando lo ingreso en shell (mi shell), pero quiero saber si funciona cuando lo cronejecuta, podría verse afectado por ENV o cosas específicas de shell ( ~expansión) o cosas de propiedad y permisos o ...
Ali

2
Entonces, ¿por qué no crear una nueva tarea cron cada minuto con el mismo comando?
favadi

13
Esto es exactamente lo que terminé haciendo, pero me preguntaba si hay una manera de decirle a cron que quieres que se ejecute una prueba en el trabajo no 7. ¡Seguramente otros han tenido este problema / solicitud / deseo antes!
Ali

44
Muy tarde a la escena aquí a través de Google, pero había algo mal en la respuesta de Favadi. Estaba claro que quería probarlo desde cron y sin editar el crontab específicamente para hacerlo. Un poco peor que alguien que te dice lo que quieres está mal cuando no han tratado de entender el caso de uso.
HörmannHH

Respuestas:


32

Hasta donde sé, no hay forma de hacerlo directamente, ya que cron tiene un propósito especial: ejecutar comandos de horarios en un momento específico. Entonces, lo mejor es crear manualmente una entrada crontab o escribir un script que elimine y restablezca el entorno.


57

Puede forzar que el crontab se ejecute con el siguiente comando:

run-parts /etc/cron.daily

99
... bajo el supuesto de que el trabajo cron del OP (pedido hace 3 años) está en cron.daily en lugar de un crontab individual.
Jeff Schaller

18
Sin embargo, esto no simula completamente el entorno del usuario cron, por lo que es muy probable que todavía tenga errores porque una vez que ejecuta su script como un trabajo cron real, su PATH y otros entornos pueden ser diferentes al usuario que hizo run-parts /etc/cron.daily. Estoy luchando contra este error en este momento, ya que mi script se ejecutará bien run-partspero falla cuando realmente se ejecuta bajo el usuario cron.
ArtHare

42

Puede simular el entorno de usuario cron como se explica en "Ejecución de un trabajo cron de forma manual e inmediata" . Esto le permitirá probar que el trabajo funciona cuando se ejecutará como el usuario cron.


Extracto del enlace:


Paso 1 : pongo esta línea temporalmente en el crontab del usuario:

* * * * *   /usr/bin/env > /home/username/tmp/cron-env

luego lo sacó una vez que se escribió el archivo.

Paso 2 : me hice un pequeño script bash run-as-cron que contiene:

#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"

Entonces, como usuario en cuestión, pude

run-as-cron /the/problematic/script --with arguments --and parameters

Truco útil Por supuesto, eso no ayudará si tiene un signo de porcentaje en su comando.
basic6

0

Encontré una solución que parece ser un poco mejor para mis propósitos (los comandos se muestran para CentOS / RHEL, pero deberían ser adaptables básicamente en cualquier lugar).

Esto requiere libfaketime: puede compilarlo usted mismo desde la fuente en https://github.com/wolfcw/libfaketime o simplemente usar uno de los muchos paquetes de https://pkgs.org/download/libfaketime .

  1. Detener el servicio crond - service crond stop
  2. Averigua cuándo debe ejecutarse tu servicio : https://crontab.guru es bastante útil para esto.
  3. Ejecute crond en modo de primer plano a través de la faketimeherramienta libfaketime (le permite simular la llamada al sistema para búsquedas de tiempo para cualquier proceso secundario).
    1. No ejecutaría esto en un servidor de producción
    2. faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x test,sch
[root@user-crontesting-dvc-01 ~]# faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x sch
debug flags enabled: sch
[4841] cron started
log_it: (CRON 4841) INFO (Syslog will be used instead of sendmail.)
log_it: (CRON 4841) INFO (RANDOM_DELAY will be scaled with factor 34% if used.)
log_it: (CRON 4841) INFO (running with inotify support)
[4841] GMToff=0
log_it: (CRON 4841) INFO (@reboot jobs will be run at computer's startup.)
[4841] Target time=1571299200, sec-to-wait=11
user [root:0:0:...] cmd="/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1"
[4841] Target time=1571299260, sec-to-wait=60
log_it: (root 4844) CMD (/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1)
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: syntax error near unexpected token `&')
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: `/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1')
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.