我尝试了http://mywiki.wooledge.org/ProcessManagement和http://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行:意外标记`{'附近的语法错误。
答案 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}}(分号)是!!注意:
- [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;信息。
希望这有帮助,
干杯!