我有一个脚本,可以启动 Firefox 4 秒钟,然后将其关闭。Firefox 将自动登录强制门户,因此我只需要在 Wi-Fi 连接后打开它 4 秒钟。我使用的是 Ubuntu 13.04。
我的问题似乎是 $pid 没有设置。
firefox ; pid=$!
sleep 4
kill $pid
编辑:删除了设置,现在它会杀死一个无效的 pid。
答案1
你的脚本不起作用,因为它会等待 Firefox 进程结束并然后执行pid=$!
并执行另一个命令。
做你想做的事情的一个简单方法是timeout
:
timeout 4s firefox
它启动第一个参数后提供的程序,并在第一个参数给定的时间过去后停止它。
答案2
pid=$!
你失败的原因$!
是上次运行的作业的 PID背景。
IE,
$ foo & echo $!
将启动foo
并回显其进程的 PID。
在您的情况下,firefox ; pid=$!
需要将其替换为,firefox & pid=$!
但它可能毫无用处,因为firefox
它是一个脚本,它exec
是实际的二进制文件。
你需要做的是使用killall
(这将试图杀死全部实例 Firefox,无论是您的还是其他用户的)或(复制和)编辑/usr/bin/firefox
脚本以回显新的 PID。
答案3
另外还有一些解决方案。
firefox & sleep 12; kill $!
通用性很好。应该可以在任何地方使用。aptget install timeout
和timeout -k 3m 14s firefox
(我刚刚检查了一个 Ubuntu 服务器和一个 FreeBSD 服务器。两者都没有默认安装)。expect
按照这里说明使用:https://unix.stackexchange.com/questions/43340/how-to-introduce-timeout-for-shell-scriptingperl -e "alarm 10; exec @ARGV" "firefox"
$COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID
( 来源及说明)
答案4
我不确定它是否适合您的情况,但您可以使用killall
代替kill
。因此它将是:
firefox
sleep 4
killall firefox
我认为更正确的方法是使用获取最后一个 Firefox 进程ps aux | grep firefox
,但今天我不知道如何使用 bash 脚本进行仅返回最高进程号的处理。