Exécuter la commande après quelques secondes (sans sommeil)

15

Comment puis-je exécuter une commande après X secondes sans sommeil. Ou avec sommeil mais sans le shell attend juste la réponse de cette commande?

J'ai utilisé ça mais ça n'a pas marché

sleep 5 ; ls > a.txt

J'ai besoin de l'exécuter en arrière-plan. J'essaye de ne pas avoir à l'exécuter dans un script j'essaie d'exécuter lsaprès 5 secondes, et le shell n'attend pas seulement la fin du sommeil

Martin
la source
Pourquoi ça ne marche pas sans la coque? Quelle erreur obtenez-vous? Êtes-vous en train de passer le chemin complet? Savez-vous quelle partie analyse le ;?
Hennes
de cette façon, le shell bloquera 5 secondes, puis exécutera la commande., le shell à bloquer, je n'ai pas besoin de cela.
Martin
Ensuite, vous devez soit le démarrer dans un script en arrière-plan, soit dans un sous-shell.
Hennes

Réponses:

34

Une façon plus concise d'écrire ce que Hennes a suggéré est

(sleep 5; echo foo) & 

Alternativement, si vous avez besoin de plus de quelques secondes, vous pouvez utiliser at. Il existe trois façons de donner une commande à at:

  1. Tuyau:

    $ 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. Enregistrez la commande que vous souhaitez exécuter dans un fichier texte, puis passez ce fichier à 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. Vous pouvez également passer des atcommandes depuis STDIN:

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

    Appuyez ensuite sur CtrlDpour quitter le atshell. La lscommande sera exécutée en une minute.

Vous pouvez donner des heures très précises au format [[CC]YY]MMDDhhmm[.ss], comme dans

$ at -t 201412182134.12 < script.sh

Cela exécutera le script script.shà 21h34 et 12 secondes le 18 décembre 2014. Donc, en théorie, vous pourriez utiliser atpour exécuter quelque chose cinq secondes à l'avenir. Cependant, c'est un peu comme utiliser un tank pour écraser une mouche, et la suggestion de Hennes est meilleure.

terdon
la source
Je n'arrêtais pas de jouer avec $(sleep 5; echo foo) &je ne sais pas pourquoi je pensais que j'avais besoin d'un $ devant cela, mais avec ma syntaxe erronée, je viens de publier la version plus longue (et plus compréhensible). (command_for_in_new_shell) est cependant plus court.
Hennes
@Hennes et moi avons ouvertement arraché votre très bonne idée (que j'ai surévaluée). Tout ce que j'ai fait, c'est de le reformater pour être plus court, tout le crédit pour les bits de réflexion réels est à vous :).
terdon
Est-il possible d'utiliser atavec un retard en quelques secondes?
Fund Monica's Lawsuit
@NicHartley no. Utilisez un temps spécifique (par exemple at 21:43) si c'est ce que vous voulez, ou faites simplement quelque chose de simple comme sleep 4 && commandexécuter commandaprès 4 secondes.
terdon
4

Vous pouvez contourner ce problème en démarrant un shell ou un script en arrière-plan.

Exemple:

/ bin / sh -c "sleep 5; echo foo" &
[1] 63791
> Invite du shell actif ici

foo 5 secondes plus tard, la sortie apparaît.
Hennes
la source