Linux运行具有时间限制(超时)的命令

时间:2020-01-09 10:41:55  来源:igfitidea点击:

如何启动名为foo的命令,如果在几秒钟内给出DURATION后仍然运行,则将其杀死。
如何在Linux上运行时间限制命令?
如何运行Linux命令,并在N秒后使其超时(中止)?
您可以在Linux中给出超时命令示例吗?

GNU/Linux附带超时命令。
它运行一个有时间限制的命令。
也可以使用Perl或者bash shell运行命令,并使其在N秒后超时。
本教程说明如何启动命令,以及在指定的超时时间到期时将其杀死。
换句话说,请在有限的时间内运行Linux或者Unix命令。

如何在Linux上运行具有时间限制的命令

我们的目标是运行一个名为" ping www.theitroad.local"的命令,其时限为30秒:

  • 打开终端应用程序
  • 运行ping命令使其在30秒后中止:times 30s ping www.theitroad.local可以结合睡眠和其他shell命令:`ping www.theitroad.local&sleep 30s;杀死$!

让我们查看Linux操作系统中的所有超时命令,语法和示例。

Linux时间限制命令

超时命令的语法如下:

timeout DURATION COMMAND
timeout DURATION COMMAND arg1 arg2
timeout 1m ping google.com
timeout 30s tracepath www.theitroad.local
timeout [options] DURATION COMMAND arg1 arg2

DURATION是一个浮点数,带有一个可选的后缀,如下所示:

  • s秒(默认)。
  • m分钟。
  • h小时。
  • d天。

如何运行ping命令8秒钟并中止运行

尝试:

date
timeout 8s ping www.theitroad.local
timeout 8s ping 192.168.1.254
date

ssh的Linux超时命令

假设您只想为运行命令/app1的消防指令启动ssh会话,并在5分钟后死亡,请运行:

timeout 5m [email protected] -- /path/to/app1 --save --force --update

指定超时时要发送的信号

语法为:

timeout -s 9 YourCommandHere
timeout --signal=9 YourCommandHere
timeout -s 15 30s tracepath google.com
timeout -s 9 2m tail -F /var/log/secure
## send SIGTERM as terminate signal ##
timeout -s SIGTERM 5m ping google.com

要获取信号列表,请运行以下kill命令:

kill -l

输出示例:

1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

如何设置宽限期

将-k或者--kill-after = DURATION选项传递给超时命令。
例如,如果在发出初始信号后很长时间COMMAND仍在运行,则发送KILL信号:

timeout -k=5 2m command1 arg1
timeout -k=5 -s SIGKILL 2m /path/to/my-app arg1 arg2

其他选项:

--preserve-status`选项允许超时以与COMMAND相同的状态退出,即使命令超时也是如此。

timeout --preserve-status 10s command1

当不直接从shell提示符运行超时时,--foreground选项允许COMMAND从TTY中读取并获取TTY信号;在这种模式下,COMMAND的子代不会超时:

timeout --foreground 1m command2
## Login to remote server. Run htop and die after 30seconds ##
timeout --foreground 30s ssh -t [email protected] htop
timeout --foreground 20s ssh -t Hyman@centos7 top

Bash解决方案

借助read命令和kill命令,语法非常简单:

MyCoolCommand Arg1 & read -t TIMEOUT_VALUE || kill $!
command arg1 & read -t 30 || kill $!
tail -F /var/log/secure & read -t 60 || kill $!
ping 192.168.1.254 & read -t 10 || kill $!

$!包含最近执行的后台管道的进程ID(PID)。
在此示例中,ping是最近执行的后台作业。

在Linux中使用timeout命令来确定可用的ssh身份验证方法

语法如下,借助grep命令为在FreeBSD Unix服务器上运行的sshd提供可用的ssh身份验证方法:

## set up server name and user 
server="192.168.1.236"
user="Hyman"
 
## Run ssh with true command and grep output 
timeout 5 ssh -v ${user}@${server} true 2>&1 \
| grep "Authenticating to\|Authentications that can continue:"
 
server="ls.www-db-1"
user="Hyman"
timeout 5 ssh -v ${user}@${server} true 2>&1 \
| grep "Authenticating to\|Authentications that can continue:"

确保在Linux上禁用ssh密码登录以提高安全性。