2012-05-03 5 views
3

http://mywiki.wooledge.org/ProcessManagementhttp://mywiki.wooledge.org/BashFAQ/068Myからさまざまな手順を試しましたが、特定の時間間隔の後にtail -fコマンドを強制終了する方法はありません。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. 

私は尾-fのserver.logのPIDを殺すとJBossサーバーが起動されているかどうかを見つけるために小さな機能である「STRT」に進んでしようとしています。 -c:行0:予期しないトークンの近くに構文エラー `{」私は

bashのようなエラーを取得し実行する上

+0

「su」を除いた '-c'引数のすべてを実行できますか?あなたのサブシェルが中括弧の代わりに '(sleep 20; kill $ pid;)'のようにかっこを使うように見えます。 –

+0

いいえ、私はかっこで試しました。同じエラーです。 – Johnbritto

+1

なぜ 'tail'を使うのですか? 'RUN_Server.sh | RUN_Server.sh 'だけに意味があるようです。ティーサーバー。ログ '。 – FatalError

答えて

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

何をしようとしていますか? {の前にセミコロンを追加するだけでもいいですか?

+0

いいえ、それはdoesnt仕事。すべて私はN秒後に尾を出そうとしています。 tail -f server.logはserver.logの継続的な増加を表示するためです。私はシェルを殺すためにCtrl + Cを与えなければなりません。私はbashスクリプトでそれを試しています。 – Johnbritto

0

あなたが持っている問題はsleetailを殺すまでpコマンドが実行されないことです。

コマンド構造は:

command1 && command2 

command1を実行するように言うと、それは0の終了コードで終了した場合、その後、command2を実行します。これはこれと同じです:

if command1 
then 
    command2 
fi 

これまでと似たような状況でした。私はWeblogicサーバーを起動し、サーバーが起動するまで待ってからサーバー上で何かをしなければなりませんでした。

これを行うにはnamed pipes (Directions)を使いました。この名前付きパイプを通じてWeblogicサーバーを起動するコマンドを実行しました。私はその後、別のプロセスでパイプを読んでいました。スタートアップ文字列を見たとき、私はループを壊してプログラムを続けました。

上記のリンクは、それを行うための完全な指示を与えるはずです。

+0

ありがとうございます。私は方法を発見しました。[リンク](https://gist.github.com/2377029)LOG =/var/log/tomcat/catalina.out sed '/^INFO:サーバーの起動/ q' <(末尾-n 0 -f $ LOG)。これは私のserver.logに単語を見つけてそれを殺します。 – Johnbritto

3

は、私は似たような試みていたこの

timeout 20 tail -f server.log 
+0

残念ながら、solarisではありません... –

0

、すなわちワンライナー/一行に、アンパサンド(&)とバックグラウンドで生成されたプロセスのPIDをプリントアウトしたかったしてみてください。

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

...しかし、私はこの記事に私をもたらした恐ろしい構文エラーを取得し続けた。私は上記の私の例では実現しなかった何

&(アンパサンド)bashのコマンドセパレータ/ターミネータであるということです - ちょうど;(セミコロン)などがある!!注:

BashSheet - Greg's Wiki

  • [コマンド]。 [コマンド] [改行]
    セミコロンと改行は、互いに同期コマンドを分離します。
  • [コマンド] & [コマンド]
    単一のアンパサンドは、非同期コマンドを終了します。

だから - 与えられたコマンドラインターミネータある上記;続いて私の例では、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=$!、見て - と以前の "合法"コマンドは、末尾にと表示され、中括弧{は現在のシェルで新しいコマンドグループを意味します。だから、答えはセミコロン;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))、「[1]+ Terminated ...」というメッセージが表示されたら、シェルでEnterキーを押す必要があります。

希望すると、
乾杯!

関連する問題