pgrepはプロセスを開始するよりも速く、スリープを使用しますか?


2

CSHスクリプトとコマンドにいくつか問題があります。

set XVFBCHK2 = `pgre -f 'Xvfb' | wc -l`

一貫性のない値を返すようです。1を返す必要がある場合は0を返します。grep関数が速すぎるため、コマンドラインに続くXvfbの新しいインスタンスをキャッチしません。

Xvfb :1 -screen 0 1600x1200x16 >& /dev/null &

たとえば、この一連のCSHスクリプトでは:

if ( $XVFBCHK ==  0 && $FIJICHK == 0 ) then
    set DISP=0
    set SCREEN=0
    Xvfb :1 -screen 0 1600x1200x16 >& /dev/null &

    set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
    echo $XVFBCHK2
    if ( $XVFBCHK2 == 1 ) then
            set DISP=1
            set SCREEN=0
    else if  ( $XVFBCHK2 == 0 ) then
            Xvfb :2 -screen 0 1600x1200x16 >& /dev/null &
            set DISP=2
            set SCREEN=0
    endif

    set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
    echo $XVFBCHK2
    if ( $XVFBCHK2 == 0 ) then
            Xvfb :3 -screen 0 1600x1200x16 >& /dev/null &
            set DISP=3
            set SCREEN=0
    endif

    set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
    echo $XVFBCHK2
    if ( $XVFBCHK2 == 0 ) then
            Xvfb :4 -screen 0 1600x1200x16 >& /dev/null &
            set DISP=4
            set SCREEN=0
    endif

    set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
    echo $XVFBCHK2
    if ( $XVFBCHK2 == 0 ) then
            Xvfb :5 -screen 0 1600x1200x16 >& /dev/null &
            set DISP=5
            set SCREEN=0
    endif

    set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
    echo $XVFBCHK2
    setenv DISPLAY :$DISP.$SCREEN
  elseif
  echo $XVFBCHK2
  echo $DISP

次の出力を取得できます。

       0
       0
       3
       3
       3
       3
       3

Xvfbは3回実行されたようですが、pgrepは3回目まで実行をキャッチしませんでした。最初の試行をキャッチするか、最初の試行Xvfb:1が失敗し、次にXvfb:2を試行する必要があることを正確に判断するにはどうすればよいですか?

回答:


0

X11の実装とプラットフォームによっては、動作する回避策があります。

Xorgを使用するLinuxでは、/tmp/.X11-unixlocalhostで使用可能な各ディスプレイの下にファイル(実際にはソケット)が表示されます。たとえば、1つのXvfbをオンに:2し、通常のXをオンにする:0と、次のようになります。

$ ls -l /tmp/.X11-unix
total 0
srwxrwxrwx 1 root root 0 Oct  4 09:06 X0
srwxrwxrwx 1 root root 0 Oct  4 11:37 X2

したがって、Xvfbsを盲目的に開始しようとするのではなく、ディスプレイが使用可能かどうかを次のように確認します。

if ( -e /tmp/.X11-unix/X$DISP ) then
   ...
endif

ループを使用して、最初に使用可能なディスプレイ番号を見つけることができます。

それは少し際どいですが、ほとんどの状況で動作するはずです。他のオペレーティングシステムでこれが機能するかどうか(または同様の回避策があるかどうか)はわかりません。


0

だから私がやっていてうまくいくように見えるのは、pgrepにwhileループを使用して新しいプロセスをキャッチすることです:

    set i=0
    while ( $i <= 100 )
            set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
            @ i++
    end

回答ありがとうございます。これは、使用されていないディスプレイを検索するための代替手段としてうまく機能すると思います。この目的のために別のスクリプトがあり、あなたの方法はこの目的に最適です。

クラスター管理者は、ノードごとに1つのXvfbディスプレイのみを必要としていることがわかりました。実行中のディスプレイがないことを最初に検索する限り、使用されていないディスプレイを見つけることを心配する必要はありません。Xvfbディスプレイの実行に成功したかどうかを心配するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.