我正在编写一个供自己使用的 bash 脚本。如何运行命令一段时间(例如 20 秒)然后终止它?我尝试了很多解决方案,但都不起作用。我也尝试了命令,但timeout
没有成功。请给我一些解决方案。
例如:我想在脚本中运行此命令并在 10 秒后终止它
some command
答案1
嗯,这样应该可以解决问题:
xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave
xmessage
在这里提供一个快速测试用例(在您的情况下,airodump 命令应该放在那里);&
将其放入后台。
$!
保存最后启动进程的 PID(参见例如https://stackoverflow.com/a/1822042/2037712);PID 被保存到变量中pidsave
。
sleep
等待一段时间( )后,TERM
向进程发送信号。
答案2
在 bash 提示符下,您可以使用“
your_command & sleep 20; kill $!
- 或者使用超时命令:
aptget install timeout
例如timeout -k 3m 14s your_command
expect
或者按照这里说明的方式使用:https://unix.stackexchange.com/questions/43340/how-to-introduce-timeout-for-shell-scripting- 或者用 perl 来做:
perl -e "alarm 10; exec @ARGV" "Your_command"
- 或者使用这个更神秘的解决方案
$COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID
:( 来源及说明)
答案3
另一种方法是使用 pgrep $pattern 或 pkill $pattern;返回与给定模式匹配的所有 PID,查看机器上所有正在运行的进程。因此,要将 PID 的范围限制为您拥有的 PID,请使用:pgrep -P $mypid $pattern 或 pkill -P$mypid $pattern
因此,要运行一段时间的后台进程,你的脚本将如下所示:
#!/bin/bash
mypid=$$
run_something &
sleep $time_in_seconds
pkill -P $mypid something
请记住,这将终止当前父 PID 下运行的所有具有相同名称模式的进程。因此,您可以使用它来启动多个进程,并在一定时间后同时终止它们。