¿Cómo programar un comando para que se ejecute más tarde?

87

¿Cuál es una manera simple de ejecutar un comando, digamos, dentro de 8 horas? Puedo pensar de esta manera:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

¿Hay una forma más "adecuada"?

Steve Bennett
fuente
¿Hay algo mal con nohup+ sleep? ¿Por qué es "impropio"?
cprn

Respuestas:

123

Puedes usar el atcomando. Los atcomandos de ejecución en un momento posterior. La atutilidad leerá los comandos de la entrada estándar y los agrupará como en el trabajo, para ser ejecutados en un momento posterior.

Por lo general, atse instala de manera predeterminada en Ubuntu, pero si su versión no lo incluye, instale a través de:

sudo apt-get install at

Para obtener más información, opciones, ejemplos y otros, consulte el repositorio de la página de manual de Ubuntu

Ejemplo:

at now +8 hours -f ~/myscript.sh

También puede usar las manos cortas convenientes, como tomorrowo noon, como en

echo "tweet fore" | at teatime 

Advertencia: Esto ejecutará el comando a la izquierda de la tubería inmediatamente pero solo presentará su salida más tarde. El ejemplo también demuestra cómo puede canalizar accionesat. at -ces la forma en que puede examinar las acciones programadas, que puede enumerar convenientemente con su número, como con:

at -c 3
Mitch
fuente
19
Puede ser útil agregar un ejemplo de uso simple que aborde la pregunta del póster original más específicamente, por ejemploat now +8 hours -f ~/myscript.sh
steeldriver
66
Además, hay at 8:00que ejecutar el comando en un momento absoluto y batchpara "cuando parece que la computadora está inactiva"
Simon Richter
44
En caso de que alguien se lo preguntara, teatimees a las 4pm. Por algunas razones, no se menciona en manpages.ubuntu.com/manpages/raring/man1/at.1posix.html, pero está man ataquí y en manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Dan
3
¿Quizás podemos mencionar que la utilidad "at" no está instalada de manera predeterminada y si alguien más quiere obtenerla, simplemente instale el paquete "at"? Editar: De todos modos, simplemente edité la respuesta (también arreglé el enlace de la página de manual).
heartsmagic
44
Tenga en cuenta que la conexión en at ejecutará el comando de inmediato y solo programará la salida. Tuve un error de impresión 3D de 4 horas porque quería programar gpio write 8 1pero se ejecutó de inmediato.
Maciej Swic
8

Sí, puedes configurar un trabajo cron.

Por ejemplo, si ahora son las 14:39:00 y hoy es viernes 30 de agosto, puede agregar el siguiente trabajo cron (que se ejecutará después de 8 horas) en su archivo crontab usando el crontab -ecomando:

39 22 30 8 5  /path/to/mycommand.sh

Más sobre:

Radu Rădeanu
fuente
3
Ok, sí, debería haber mencionado que sé sobre los trabajos de Cron. Esto es aún más desordenado porque luego se sienta en el crontab indefinidamente, ¿verdad?
Steve Bennett
44
@ RaduRădeanu: con cron, con cuidado de que pueda disparar nuevamente en unos años (cuando hay otro 30 de agosto ocurriendo un viernes) ...
Olivier Dulac
2
Este es un truco inteligente. Sin embargo, 'at' es una forma mucho mejor. ¿Qué pasaría si la computadora se apagara a las 14:39?
emory
1
Err, ese todavía no es mi punto. Mi punto es que el texto que ingresó (creo) literalmente todavía estará en su crontab después del evento, creando otra tarea de limpieza para usted.
Steve Bennett
2
@SteveBennett Sí, tienes razón. El comando permanecerá en tu crontabhasta que lo elimines. Un año después, cuando haya olvidado quién lo puso allí y por qué, se quedará rascándose la cabeza preguntándose qué hacer con el comando.
Paddy Landau
8

Utilice la interfaz gráfica de usuario basada en Gnome para cron, aty similares:

La introducción de CronHowto sugiere usar la gnome-scheduleinterfaz gráfica de usuario , que es mucho mejor que escribir toda la basura en el terminal (especialmente para usuarios "promedio" de Ubuntu que no son usuarios "poderosos" * nix / bsd).

Ejecútelo utilizando el Unity Dash (u otro menú de aplicaciones) para buscar tareas programadas o en ejecución gnome-schedule.

En los sistemas Ubuntu basados ​​en Gnome, la herramienta Tareas programadas de Gnome (del paquete gnome-schedule) en Aplicaciones -> Herramientas del sistema proporciona una interfaz gráfica con instrucciones para usar Cron. El sitio web del proyecto está en http://gnome-schedule.sourceforge.net/ ; el software se puede instalar desde el Centro de software o escribiendo

sudo apt-get install gnome-schedule

en una terminal

Usando gnome-schedule, para una secuencia de comandos en su directorio de inicio, se configuraría un nuevo comando "at" usando este tipo de ventana:

ingrese la descripción de la imagen aquí

user29020
fuente
5

Descubrí una forma rápida y sucia de hacer esto antes de descubrir que atera una cosa.

Digamos que quieres que tu script se ejecute al mediodía:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Digamos que quiere que se ejecute mañana al mediodía (hoy es 24 de noviembre para mí):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Actualización : Método ligeramente mejor: solo prueba los números que te interesan, usando date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...
wjandrea
fuente
10
A las dos personas que han upvoted esta respuesta, por favor utilice at, crono cualquier otra aplicación real planificador. La programación de tareas es difícil, y no es una rueda que debe reinventar.
dimo414
1
@ dimo414 ¿Qué tiene de malo mi método?
wjandrea
8
Como mínimo, está ocupado esperando, lo cual es un desperdicio. Peor aún, no se garantiza que sea correcto; es perfectamente posible (si es poco probable) que se pierda el condicional. Basar su programador en expresiones regulares también es muy propenso a errores. Puede funcionar bastante bien , pero no tiene ventajas at.
dimo414
(Aparte: No downvote su respuesta, yo no creo que la gente debe usarlo)
dimo414
44
Otra razón para usar ates porque sus trabajos sobrevivirán a un reinicio.
manatwork