Ejecutar comando después de segundos (sin dormir)

15

¿Cómo puedo ejecutar un comando después de X segundos sin dormir? ¿O con el sueño pero sin el caparazón solo espera la respuesta de ese comando?

Usé esto pero no funcionó

sleep 5 ; ls > a.txt

Necesito ejecutarlo en segundo plano. Intento no tener que ejecutarlo en un script que intento ejecutar lsdespués de 5 segundos, y Shell no solo espera el final del sueño

Martín
fuente
¿Por qué no funciona sin la cáscara? ¿Qué error obtienes? ¿Estás pasando el camino completo? ¿Sabes qué parte analiza el ;?
Hennes
de esta manera el shell bloqueará 5 segundos y luego ejecutará el comando., el shell se paralizará No necesito eso.
Martin
Luego, debe iniciarlo en un script en segundo plano o en un subconjunto.
Hennes

Respuestas:

34

Una forma más concisa de escribir lo que Hennes sugirió es

(sleep 5; echo foo) & 

Alternativamente, si necesita más de unos segundos, puede usar at. Hay tres formas de dar un comando a at:

  1. Tubería:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. Guarde el comando que desea ejecutar en un archivo de texto y luego pase ese archivo a at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. También puede pasar atcomandos desde STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    Luego, presione CtrlDpara salir del atcaparazón. El lscomando se ejecutará en un minuto.

Puede dar tiempos muy precisos en el formato de [[CC]YY]MMDDhhmm[.ss], como en

$ at -t 201412182134.12 < script.sh

Esto ejecutará el script script.sha las 21:34 y 12 segundos el 18 de diciembre de 2014. Por lo tanto, en teoría, podría atejecutar algo cinco segundos en el futuro. Sin embargo, eso es como usar un tanque para aplastar una mosca, y la sugerencia de Hennes es mejor.

terdon
fuente
Seguí jugando con $(sleep 5; echo foo) &No estoy seguro de por qué pensé que necesitaba un $ delante de eso, pero con mi sintaxis incorrecta, publiqué la versión más larga (y más comprensible). (command_for_in_new_shell) es más corto sin embargo.
Hennes
@Hennes y yo estafamos descaradamente tu muy buena idea (que voté positivamente). Todo lo que hice fue volver a formatearlo para que sea más corto, todo el crédito por los bits de pensamiento reales es suyo :).
terdon 05 de
¿Hay alguna forma de usar atcon un retraso en segundos?
Financia la demanda de Mónica el
@NicHartley no. Use un tiempo específico (por ejemplo at 21:43) si eso es lo que desea, o simplemente haga algo simple como sleep 4 && commandcorrer commanddespués de 4 segundos.
terdon
4

Puede solucionarlo iniciando un shell o un script en segundo plano.

Ejemplo:

/ bin / sh -c "dormir 5; echo foo" y
[1] 63791
> Indicador de shell activo aquí

5 segundos después aparece la salida.
Hennes
fuente