如何在子shell中停止执行tail -f命令

时间:2012-05-03 11:08:30

标签: bash

我尝试了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 个答案:

答案 0 :(得分:3)

试试这个

timeout 20 tail -f server.log

答案 1 :(得分:0)

pid=$! { sleep 20 ; kill $pid; }

你想做什么?也许只是在{之前添加分号可以提供帮助吗?

答案 2 :(得分:0)

您遇到的问题是,在您杀死slee之后,tail p命令才会运行。

命令结构:

command1 && command2

表示要运行command1,如果退出时退出代码为0,则运行command2。它等同于:

if command1
then
     command2
fi

我前段时间的情况类似。我必须启动Weblogic服务器,等到服务器启动,然后在服务器上执行某些操作。

我最终使用named pipes (Directions)来执行此操作。我通过这个命名管道运行了启动Weblogic服务器的命令。然后我有另一个进程读取管道,当我看到启动字符串时,我打开了循环并继续我的程序。

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

答案 3 :(得分:0)

我正在尝试类似的东西,即想要打印出在背景中用&符号(&)生成的进程的pid,在单行/单行中:

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

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

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

BashSheet - Greg's Wiki

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

所以 - 假设;&中的命令行终结符,在我上面的示例中后跟一个bash,它也是 命令行终结符 - ;扼流圈。答案就是删除分号bash,只让&符号;充当单行中的命令行分隔符:

&

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

要回到OP问题,我可以使用此命令行重建问题:

$ 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
$ 

考虑到这一点 - bash将$ tail -f /var/log/syslog & pid=$! { sleep 2; kill $pid; } bash: syntax error near unexpected token `}' 视为分隔符,然后看到&#34; legal&#34;命令&,然后 - 使用之前的&#34; legal&#34;命令 unterminated ,看到大括号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(版本4.2.8(1))中,我必须在shell中按Enter键才能看到&#34; bash&#34;信息。

希望这有帮助,
干杯!