3

我尝试了http://mywiki.wooledge.org/ProcessManagementhttp://mywiki.wooledge.org/BashFAQ/068My的各种步骤, 但我无法实现的是如何在特定时间间隔后终止 tail -f 命令。

我的脚本:

#!/bin/bash

function strt ()
{
command 1..
command 2..
}

export -f strt
su user -c 'set -e && RUN_Server.sh > server.log && tail -f server.log & pid=$! { sleep 20; kill $pid; } && strt'

exit 0.

我正在尝试杀死 tail -f server.log 的 pid 并继续执行“strt”,这是一个查找 jboss 服务器是否启动的小功能。

在执行时我得到错误

bash:-c:第 0 行:意外标记 `{' 附近的语法错误。

4

4 回答 4

3

尝试这个

timeout 20 tail -f server.log
于 2012-08-03T22:38:26.247 回答
0

我正在尝试类似的事情,即想在&单行/单行中打印出在后台使用 & 号 ( ) 生成的进程的 pid:

$ tail -f /var/log/syslog & ; echo $! 
bash: syntax error near unexpected token `;'

...但不断收到可怕的语法错误,这让我来到了这篇文章。

在上面的示例中我没有意识到的是,&(和号)也是命令分隔符/终止符bash- 就像;(分号)一样!笔记:

BashSheet - Greg 的维基百科

  • [命令] ; [command] [newline]
    分号和换行符将同步命令彼此分开。
  • [command] & [command]
    单个 & 号终止异步命令。

所以 - 假设&是 中的命令行终止符bash,在我上面的示例中,后面跟着一个;,它也是命令行终止符 -bash扼流圈。答案是简单地删除分号;,并且只让 & 号&作为单行中的命令行分隔符:

$ tail -f /var/log/syslog & echo $! 
[1] 15562
15562
$ May  1 05:39:16 mypc avahi-autoipd(eth0)[23315]: Got SIGTERM, quitting.
May  1 06:09:01 mypc CRON[2496]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
May  1 06:17:01 mypc CRON[5077]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May  1 06:25:01 mypc CRON[7587]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
^C
$ May  1 06:52:01 mypc CRON[15934]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ))
$ ps -p 15562
  PID TTY          TIME CMD
15562 pts/0    00:00:00 tail
$ kill 15562
$ ps -p 15562
  PID TTY          TIME CMD
[1]+  Terminated              tail -f /var/log/syslog
$ ps -p 15562
  PID TTY          TIME CMD
$ 

...但是,在此示例中,您必须手动终止生成的进程。

回到 OP 问题,我可以用这个命令行重建问题:

$ tail -f /var/log/syslog & pid=$! { sleep 2; kill $pid; } 
bash: syntax error near unexpected token `}'

考虑到这一点 - bash 将&其视为分隔符,然后看到“合法”命令pid=$!,然后 - 与先前的“合法”命令未终止,看到一个花括号{,这意味着当前 shell 中的新命令组。所以答案只是pid=$!用分号终止;,这样新的命令组就可以正常启动:

$ tail -f /var/log/syslog & pid=$! ; { sleep 2; kill $pid; } 
[1] 20228
May  1 05:39:16 mypc avahi-autoipd(eth0)[23315]: Got SIGTERM, quitting.
May  1 06:09:01 mypc CRON[2496]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
May  1 06:17:01 mypc CRON[5077]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May  1 06:25:01 mypc CRON[7587]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
May  1 06:52:01 mypc CRON[15934]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ))
$ ps -p 20228
  PID TTY          TIME CMD
[1]+  Terminated              tail -f /var/log/syslog
$ 

请注意,该tail -f过程似乎终止了属性,但在我的bash(版本 4.2.8(1))中,我必须在 shell 中按 Enter,才能看到“ [1]+ Terminated ...”消息。

希望这会有所帮助,
干杯!

于 2013-05-01T05:10:23.143 回答
0

你遇到的问题是你的sleep 命令在你杀死你的tail.

命令结构:

command1 && command2

说运行command1,如果它以退出代码退出0,则运行command2。这相当于:

if command1
then
     command2
fi

前段时间我也遇到过类似的情况。我必须启动一个 Weblogic 服务器,等到服务器启动,然后在服务器上做一些事情。

我最终使用命名管道(方向)来做到这一点。我通过这个命名管道运行了启动 Weblogic 服务器的命令。然后我让另一个进程读取管道,当我看到启动字符串时,我跳出循环并继续我的程序。

上面的链接应该为您提供完整的指导。

于 2012-05-03T19:40:23.187 回答
0
pid=$! { sleep 20 ; kill $pid; }

你想做什么?也许只是在之前添加一个分号{会有所帮助?

于 2012-05-03T16:01:53.640 回答