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

Linux 从现在起5秒后运行命令`,linux,bash,scheduled-tasks,Linux,Bash,Scheduled Tasks,作为稍微复杂的脚本的一部分,我需要告诉服务器运行模拟。通常,我会通过执行ssh来实现这一点user@server“模拟/脚本”。但是,这样做会使ssh会话保持活动状态,直到'simulation/script'完成,这对我来说是不可取的 我最近学习了at命令,它似乎很适合我的问题。 我现在要做的是将ssh连接到我的服务器上,并在处运行我的模拟脚本,使其在5秒钟内运行(超过关闭ssh连接的足够时间)。因此,一旦ssh连接在5秒内关闭,服务器将启动模拟,而不需要ssh连接保持活动状态 我遇到的问题是

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

我最近学习了
at
命令,它似乎很适合我的问题。
我现在要做的是将ssh连接到我的服务器上,并在处运行我的模拟脚本,使其在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
如何让我的
at
运行命令“从现在起5秒”

at中没有秒:

现场的人说:

  • 日期的指定必须遵循一天中时间的指定。你也可以给出时间,比如现在+计算时间单位, 其中时间单位可以是分钟、小时、天或周和 你可以告诉at今天用今天的时间来运行作业,明天用今天的时间来运行作业 明天
因此,我想你可以使用
睡眠,而不是

请参见
man 1 sleep


如果您想运行
sshuser@server“模拟/脚本”
无需等待,只需执行以下操作:

ssh user@server 'simulation/script' &
该命令将在后台运行

此外,正如罗科德所说,
nohup
将在这方面有所帮助

因此,最后:

nohup ssh user@server 'simulation/script' &
使用nohup,您可以退出终端并激活
ssh
进程


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

ssh user@server 'simulation/script &'

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

您可以在脚本前面加上
nohup
,这将确保在断开SSH会话时不会终止脚本

ssh服务器'nohup yourscript.sh&'

注意:刚刚玩了上面的游戏,必须手动终止SSH连接

另一种选择是
屏幕

screen-d-m yourscript.sh

这将启动一个分离的
屏幕
进程,您可以在以后随时重新连接到该进程

注意:我已经用下面的脚本和命令对此进行了测试,效果非常好

SSH命令

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

myscript.sh

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

重定向stdin/stdout/stderr除了使脚本后台化之外,还将允许SSH会话在执行后台命令后立即关闭:

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

来源:.

只需注意:在
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,可以在这里工作)

我认为这样做容易得多:

sleep n && command   
其中
n
是秒数。

“at”没有亚分钟分辨率,但您可以伪造它:

echo "sleep 5 ; COMMAND" | at now

您可以使用以下类似的sleep命令执行此操作:

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

我今天遇到了同样的问题,但我能够使用
nohup


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

但是如果我
&
打开
ssh
,套接字不会仍然保持打开状态吗?脚本完成后套接字将关闭这对我来说是个问题。我需要在脚本启动之前关闭套接字,因为我必须手动终止与ctrlc的ssh连接,所以使用
&
将无法工作。这不是自动的。我需要自动化、终止ssh连接并运行脚本。这就是我现在想到
的原因。我想我应该咬紧牙关,现在做+1分钟默认情况下,ssh将在远程后台运行命令后关闭。我不明白你的问题。
nohup
有什么帮助?我以前从未使用过…
nohup
不会在断开连接时终止命令。我知道您已经在1分钟内使用了
,但我会更新我的答案以供其他人参考。我仍然对
nohup
实现感兴趣(可能用于未来的项目),因此感谢您的努力。我是否必须手动终止ssh连接,或者是否可以使用
nohup
自动终止连接如果您将命令放入
ssh
行中,
ssh
将在命令执行后退出
ssh服务器“command”
有没有办法让
ssh
在远程命令执行结束之前终止连接,同时让远程命令在远程主机中保持活动状态(这就是为什么我使用
nohup
而不是
ssh
)来安排作业的原因?而不是在
上乱搞
,也许你只是想要
sshuser@serverbash-c“simulation/script&”
…我在
包.json
脚本中使用它,因此我必须这样做以防止进程被阻塞:
(sleep 5&&delayed_命令)和immediate_命令
。如果您不希望输出显示在
STDOUT
中,我还在
delayed_命令之后添加了
/dev/null 2>&1
。您不也需要
nohup
来避免进程在SSH会话关闭时被终止吗?这也是我想到的,