Запустить команду `через 5 секунд - программирование

Запустить команду `через 5 секунд

Как часть немного сложного script, мне нужно сказать серверу, чтобы он запускал симуляцию. Обычно я достигал этого, выполняя ssh [email protected] 'simulation/script'. Тем не менее, это приведет к тому, что сеанс ssh будет активным до тех пор, пока 'simulation/script' не будет выполнен, что нежелательно для меня.

Недавно я узнал о команде at и, похоже, хорошо вписывается в мою проблему.
Теперь я хочу сделать ssh на моем сервере и at my simulation script за 5 секунд (более чем достаточно времени для закрытия ssh-соединения). Таким образом, как только соединение ssh будет закрыто в течение 5 секунд, сервер начнет симуляцию без необходимости подключения ssh, чтобы остаться в живых.

У меня возникают проблемы с выражением времени, которое at необходимо для планирования задания "через 5 секунд"

Я пробовал следующие выражения времени, все из которых дают мне ошибки:

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

Как я могу заставить my at запустить мою команду "через 5 секунд"?

4b9b3361

Ответ 1

Нет секунд:

man at сказал:

  • спецификация даты должна соответствовать спецификации времени суток. Вы также можете указать время, например сейчас + count time-units, где единицами времени могут быть минуты, часы, дни или недели и     вы можете сказать, чтобы сегодня запустить работу, суффикс времени с сегодняшнего дня и завтра запустить работу, суффикс времени с помощью завтра.

Итак, вместо at вы можете использовать sleep, я думаю.

См. man 1 sleep


Если вы хотите запустить ssh [email protected] 'simulation/script' без ожидания, просто выполните:

ssh [email protected] 'simulation/script' &

команда будет работать в фоновом режиме.

Более того, как сказал Рокоде, nohup поможет там.

Итак, наконец:

nohup ssh [email protected] 'simulation/script' &

с nohup, вы можете выйти из своего терминала и оживить процесс ssh.


EDIT: если вы хотите запустить команду ssh и закрыть соединение:

ssh [email protected] 'simulation/script &'

Ответ 2

at не использует секунды, только минуты/часы/дни

Что вы можете сделать, предшествует вашему script с помощью nohup, который гарантирует, что script не будет убит при отключении сеанса SSH.

ssh server 'nohup yourscript.sh &'

ПРИМЕЧАНИЕ.. Только что играя с вышеуказанным, соединение SSH должно быть убито вручную.

Другой альтернативой может быть screen

screen -d -m yourscript.sh

Это приведет к отсоединенному процессу screen, к которому вы можете подключиться в любое время позже.

ПРИМЕЧАНИЕ. Я тестировал это со следующей командой script и отлично работал.

команда SSH

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

myscript.sh

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

Ответ 3

"at" не имеет субминутного разрешения, но вы можете подделать его:

echo "sleep 5 ; COMMAND" | at now

Ответ 4

Просто отметим: в man at я увидел, что есть переключатель -t, который будет принимать даты с секундами, но, к сожалению, секунды будут усечены:

$ 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

... и поэтому задание может быть запланировано в прошлом (также используется logger для syslog, потому что это не похоже на эхо-сообщение на терминалах. STDOUT может работать отсюда)

Ответ 5

Перенаправление stdin/stdout/stderr в дополнение к фону script позволит сеансу SSH немедленно закрыть после выполнения команды backgrounded:

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

Источник: https://serverfault.com/a/36436/138334.

Ответ 6

Я думаю, что это намного проще:

sleep n && command   

где n - количество секунд.