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会话关闭时被终止吗?这也是我想到的,