从现在起5秒后运行命令`

ins*_*get 22 linux bash scheduled-tasks

作为稍微复杂的脚本的一部分,我需要告诉服务器运行模拟.通常,我会这样做ssh user@server 'simulation/script'.但是,这样做会使ssh会话保持活着直到'simulation/script'完成,这对我来说是不可取的.

我最近了解了这个at命令,它似乎很适合我的问题.
我现在要做的是ssh到我的服务器,at我的模拟脚本在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
Run Code Online (Sandbox Code Playgroud)

如何at"从现在起5秒钟" 让我的命令运行?

Tom*_*ime 22

"at"没有亚分钟分辨率,但你可以伪造它:

echo "sleep 5 ; COMMAND" | at now
Run Code Online (Sandbox Code Playgroud)


Gil*_*not 14

在没有秒数:

man at 说过 :

  • 日期的规范必须遵循一天中的时间规范.您也可以给出像现在这样的时间+计算时间单位,其中时间单位可以是分钟,小时,天或周,您可以通过在今天添加时间并明天运行工作来告诉您今天的工作把明天的时间加上后缀.

所以不是at,你可以使用sleep我想的.

看到 man 1 sleep


如果您想在ssh user@server 'simulation/script'没有等待的情况下运行,只需执行以下操作:

ssh user@server 'simulation/script' &
Run Code Online (Sandbox Code Playgroud)

该命令将在后台运行.

此外,正如Rawkode所说,nohup将有助于那里.

最后:

nohup ssh user@server 'simulation/script' &
Run Code Online (Sandbox Code Playgroud)

使用nohup,您可以退出终端并使ssh进程保持活动状态.


EDIT:如果要运行该ssh命令并关闭连接:

ssh user@server 'simulation/script &'
Run Code Online (Sandbox Code Playgroud)


Raw*_*ode 11

at 不使用秒,只需几分钟/小时/天

您可以在脚本之前执行的操作nohup,这将确保在断开SSH会话时不会终止脚本.

ssh server 'nohup yourscript.sh &'

注意:刚刚使用上述内容,必须手动终止SSH连接.

另一种选择是 screen

screen -d -m yourscript.sh

这将启动一个独立的screen过程,您可以在以后随时重新连接.

注意:我已使用以下脚本和命令对其进行了测试,并且它运行良好.

SSH命令

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

myscript.sh

#!/bin/sh
sleep 10
echo "hello world" > /tmp/hello
exit;
Run Code Online (Sandbox Code Playgroud)


sda*_*aau 6

只是要注意:在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
Run Code Online (Sandbox Code Playgroud)

...所以这个工作实际上可能是在过去安排的(也用于loggersyslog,因为它看起来不像回应终端'stdout可以在这里工作)