Exécuter la commande `à 5 secondes à partir de maintenant

Dans le cadre d’un script légèrement complexe, je dois demander à un serveur d’exécuter une simulation. Normalement, j’y parviendrais en faisant ssh user@server 'simulation/script' . Cependant, cela garderait la session ssh en vie jusqu’à ce que 'simulation/script' soit terminé, ce qui est indésirable pour moi.

J’ai récemment appris l’existence du commandant et cela semble bien s’intégrer à mon problème.
Ce que je veux faire maintenant est de faire ssh sur mon serveur, et at mon script de simulation de s’exécuter en 5 secondes (ce qui est plus que suffisant pour que la connexion ssh soit fermée). Ainsi, une fois la connexion ssh fermée dans les 5 secondes, le serveur démarrera la simulation sans avoir besoin de la connexion ssh pour restr en vie.

Ce qui me pose problème, c’est l’expression temporelle qui est nécessaire pour planifier un travail «dans 5 secondes»

J’ai essayé les expressions de temps suivantes, qui me donnent toutes des erreurs:

 now + 5 seconds now + 5 sec now + 5 s now + 5seconds now + 5sec now + 5 s now+5sec now+5seconds now+5s 

Comment puis-je obtenir ma commande pour exécuter ma commande “5 secondes à partir de maintenant”?

Il n’y a pas de secondes à:

man at dit:

  • la spécification d’une date doit suivre la spécification de l’heure du jour. Vous pouvez également donner des temps comme maintenant + compter les unités de temps, où les unités de temps peuvent être des minutes, des heures, des jours ou des semaines. en suffixant l’heure avec demain.

Donc, au lieu de, vous pouvez utiliser un sleep je pense.

Voir man 1 sleep


Si vous souhaitez exécuter ssh user@server 'simulation/script' sans attendre, faites simplement:

 ssh user@server 'simulation/script' & 

la commande s’exécutera en arrière-plan.

De plus, comme l’a dit Rawkode, rien n’y aidera.

Donc enfin:

 nohup ssh user@server 'simulation/script' & 

Avec nohup, vous pouvez quitter votre terminal et faire vivre le processus ssh .


EDIT : si vous voulez exécuter la commande ssh et fermer la connexion:

 ssh user@server 'simulation/script &' 

“at” n’a pas de résolution en moins d’une minute mais vous pouvez le simuler:

 echo "sleep 5 ; COMMAND" | at now 

at ne pas utiliser les secondes, seulement minutes / heures / jours

Ce que vous pouvez faire est de faire précéder votre script avec nohup , ce qui garantira que le script ne sera pas tué lorsque vous déconnecterez votre session SSH.

ssh server 'nohup yourscript.sh &'

REMARQUE: Après avoir joué avec ce qui précède, la connexion SSH doit être supprimée manuellement.

Une autre alternative serait l’ screen

screen -d -m yourscript.sh

Cela lancera un processus d’ screen détaché auquel vous pourrez accéder à tout moment ultérieurement.

NOTE: J’ai testé ceci avec le script et la commande suivants et cela a fonctionné parfaitement.

Commande SSH

ssh server.com 'screen -d -m ~/myscript.sh'

myscript.sh

 #!/bin/sh sleep 10 echo "hello world" > /tmp/hello exit; 

Juste pour noter: dans man at , j’ai vu qu’il y avait un commutateur -t , qui accepterait les dates avec des secondes – mais malheureusement les secondes seront tronquées:

 $ date; date --date="now +10 seconds" +"%m%d%H%M.%S"; echo "logger AAAA" | at -t $(date --date="now +5 seconds" +"%Y%m%d%H%M.%S") Thu Feb 5 14:45:57 CET 2015 02051446.07 warning: commands will be executed using /bin/sh job 8 at Thu Feb 5 14:46:00 2015 

… et donc le travail peut être programmé dans le passé (également utilisé logger à syslog, car il ne semble pas que l’écho aux terminaux stdout puisse fonctionner à partir d’ici)

La redirection de stdin / stdout / stderr en plus de l’arrière-plan du script permettra à la session SSH de se fermer immédiatement après l’exécution de la commande backgrounded:

 ssh hostname "/path/to/script /dev/null 2>/dev/null &" 

Source: https://serverfault.com/a/36436/138334 .

Je pense que c’est beaucoup plus facile à faire:

 sleep n && command 

n est le nombre de secondes.

Vous pouvez le faire en utilisant une commande de sumil comme celle-ci:

 bash -c 'sleep 5 ; echo "test"' &