Запустить команду `через 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 секунд"?
Ответы
Ответ 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
- количество секунд.