web-dev-qa-db-fra.com

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

Dans le cadre d'un script légèrement complexe, je dois dire à un serveur de lancer une simulation. Normalement, j'y arriverais en faisant ssh user@server 'simulation/script'. Cependant, cela garderait la session ssh en vie jusqu'à ce que 'simulation/script' soit terminé, ce qui n'est pas souhaitable pour moi.

J'ai récemment appris l'existence de la commande at et elle semble bien s'intégrer à mon problème.
Ce que je veux faire maintenant, c'est de ssh sur mon serveur et at mon script de simulation s'exécute en 5 secondes (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 rester active. 

Ce qui me pose problème, c'est l'expression temporelle dont at a besoin 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 at pour exécuter ma commande "dans 5 secondes"?

21
inspectorG4dget

Il n'y a pas de secondes à l'adresse: 

man at a déclaré:

  • la spécification d'une date doit suivre la spécification de l'heure. Vous pouvez aussi 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 et vous pouvez indiquer at pour exécuter le travail aujourd'hui en ajoutant le suffixe aujourd'hui et pour exécuter le travail demain en ajoutant le suffixe demain.

Donc, au lieu de at, vous pourriez 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 sera exécutée en arrière-plan.

De plus, comme l'a dit Rawkode, Nohup y aidera.

Alors finalement: 

Nohup ssh user@server 'simulation/script' &

avec Nohup, vous pouvez quitter votre terminal et activer le processus ssh.


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

ssh user@server 'simulation/script &'
13
Gilles Quenot

"at" n'a pas une résolution inférieure à la minute mais vous pouvez le simuler:

echo "sleep 5 ; COMMAND" | at now
20
TomOnTime

at n'utilise pas les secondes, seulement les minutes/heures/jours

Ce que vous pouvez faire est de faire précéder votre script de Nohup, ce qui garantit que le script n'est pas tué lorsque vous déconnectez votre session SSH.

ssh server 'Nohup yourscript.sh &'

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

Une autre alternative serait screen

screen -d -m yourscript.sh

Cela lancera un processus screen détaché auquel vous pourrez vous reconnecter à tout moment.

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

Commande SSH

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

myscript.sh

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

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 le travail peut en fait être planifié dans le passé (également utilisé avec logger dans syslog, car il ne semble pas que l'écho sur la sortie standard des terminaux puisse fonctionner à partir d'ici)

5
sdaau

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 en arrière-plan:

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

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

1
Preston

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

sleep n && command   

n est le nombre de secondes.

0
user6787662

J'ai rencontré le même problème aujourd'hui, mais j'ai pu le résoudre en utilisant Nohup

Nohup bash -c 'sleep 5 && at now -f script-name.sh'

0
Xaero Degreaz

Vous pouvez le faire en utilisant la commande sleep comme ça:

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