26

作为一个稍微复杂的脚本的一部分,我需要告诉服务器运行模拟。通常,我会通过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

我怎样才能让我at“从现在开始 5 秒”运行我的命令?

4

8 回答 8

29

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

echo "sleep 5 ; COMMAND" | at now
于 2016-09-02T12:53:23.110 回答
14

at没有秒数

man at说过 :

  • 日期的指定必须遵循时间的指定。您还可以给出像 now + count 时间单位这样的时间,其中时间单位可以是分钟、小时、天或周,您可以通过在今天加上时间后缀来告诉 at 今天运行作业,明天运行作业用明天作为时间的后缀。

因此at,您可以使用sleep我认为的而不是 。

man 1 sleep


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

ssh user@server 'simulation/script' &

该命令将在后台运行。

此外,正如 Rawkode 所说,nohup将在这方面有所帮助。

所以最后:

nohup ssh user@server 'simulation/script' &

使用 nohup,您可以退出终端并让ssh进程处于活动状态。


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

ssh user@server 'simulation/script &'
于 2012-12-16T22:05:12.913 回答
12

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'

脚本文件

#!/bin/sh
sleep 10
echo "hello world" > /tmp/hello
exit;
于 2012-12-16T22:09:51.860 回答
7

请注意:在 中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系统日志,因为它看起来不像回显到终端的标准输出可以从这里工作)

于 2015-02-05T13:51:37.893 回答
2

我认为这样做更容易:

sleep n && command   

其中n是秒数。

于 2016-09-02T12:41:17.107 回答
1

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

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

来源:https ://serverfault.com/a/36436/138334 。

于 2012-12-21T12:40:27.643 回答
1

你可以使用 sleep 命令来做到这一点:

bash -c 'sleep 5 ; echo "test"' &
于 2018-07-05T09:29:55.990 回答
0

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

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

于 2018-10-07T15:28:14.097 回答