2012-09-12 9 views
5

私は特定の名前を持つスクリプトが実行されている頻度を数える小さなbashスクリプトを作成しています。名前でプロセスを実行する単純なbashスクリプトのカウント

ps -ef | grep -v grep | grep scrape_data.php | wc -l 

は、私が使用するコードで、sshを使用してscrape_data.phpが実行されている回数を出力します。現在、出力は例えば3です。だからこれはうまく動作します。

今私は何かカウントは1

#!/bin/sh 


if [ ps -ef | grep -v grep | grep scrape_data.php | wc -l ] -lt 1; then 
     exit 0 

#HERE PUT CODE TO START NEW PROCESS 

else 

     exit 0 
fi 

よりも小さい場合には、上記のスクリプトは、私がこれまで持っているものですが、それは動作しませんを行う小さなスクリプトを作成しようとしています。このエラーが発生しました:

[[email protected] crons]# ./check_data.sh 
./check_data.sh: line 4: [: missing `]' 
wc: invalid option -- e 

if文で何が間違っていますか?あなたがBashを使用している場合

pgrep scrape_data.php &> /dev/null 

if [ $? ]; then 
    echo no launch 
fi 

答えて

7

あなたのテストの構文が正しくない、ltはテストブラケット内になければなりません算術比較には[-ltをドロップし、((を使用します。

psは、-Cスイッチを提供します。このスイッチは、検索するプロセス名を受け入れます。
grep -vトリッキーはちょうどハックです。

#!/usr/bin/env bash 

proc="scrape_data.php" 
limit=1 

numproc="$(ps hf -opid,cmd -C "$proc" | awk '$2 !~ /^[|\\]/ { ++n } END { print n }')" 

if ((numproc < limit)) 
then 
    # code when less than 'limit' processes run 
    printf "running processes: '%d' less than limit: '%d'.\n" "$numproc" "$limit" 
else 
    # code when more than 'limit' processes run 
    printf "running processes: '%d' more than limit: '%d'.\n" "$numproc" "$limit" 
fi 
+0

ありがとう、それは働いた! –

+0

私はCentOS 6.5で、なぜ '-lt'が私にとってうまくいかないのか分かりません。' -gt'で置き換えてください。 – hailong

2

if [ $(ps -ef | grep -v grep | grep scrape_data.php | wc -l) -lt 1 ]; then 

    echo launch 

else 
    echo no launch 

    exit 0 
fi 

か、pgrepの戻り値をテストすることができます。

1

行を数える必要はありません。ただ、grepの戻り値をチェックします。

if ! ps -ef | grep -q '[s]crape_data.php' ; then 
    ... 
fi 

を[S]トリックはgrep -v grepを避けることができます。

0

答えがトップですが、実際にはうまくいきますが、自分のために働いたスクレーパーに使用したソリューションがあります。今

<?php 

/** 
* Go_Get.php 
* ----------------------------------------- 
* @author Thomas Kroll 
* @copyright Creative Commons share alike. 
* 
* @synopsis: 
*  This is the main script that calls the grabber.php 
*  script that actually handles the scraping of 
*  the RSI website for potential members 
* 
* @usage: php go_get.php 
**/ 

    ini_set('max_execution_time', 300); //300 seconds = 5 minutes 


    // script execution timing 
    $start = microtime(true); 

    // how many scrapers to run 
    $iter = 100; 

    /** 
    * workload.txt -- next record to start with 
    * workload-end.txt -- where to stop at/after 
    **/ 

    $s=(float)file_get_contents('./workload.txt'); 
    $e=(float)file_get_contents('./workload-end.txt'); 

    // if $s >= $e exit script otherwise continue 
    echo ($s>=$e)?exit("Work is done...exiting".PHP_EOL):("Work is not yet done...continuing".PHP_EOL); 

    echo ("Starting Grabbers: ".PHP_EOL); 

    $j=0; //gotta start somewhere LOL 
    while($j<$iter) 
    { 
     $j++; 
     echo ($j %20!= 0?$j." ":$j.PHP_EOL); 

     // start actual scraping script--output to null 
     // each 'grabber' goes and gets 36 iterations (0-9/a-z) 
     exec('bash -c "exec nohup setsid php grabber.php '.$s.' > /dev/null 2>&1 &"'); 

     // increment the workload counter by 36 characters    
     $s+=36; 
    } 
    echo PHP_EOL; 
    $end = microtime(true); 
    $total = $end - $start; 
    print "Script Execution Time: ".$total.PHP_EOL; 

    file_put_contents('./workload.txt',$s); 

    // don't exit script just yet... 
    echo "Waiting for processes to stop..."; 

    // get number of php scrapers running 
    exec ("pgrep 'php'",$pids); 
    echo "Current number of processes:".PHP_EOL; 

    // loop while num of pids is greater than 10 
    // if less than 10, go ahead and respawn self 
    // and then exit. 
    while(count($pids)>10) 
    { 
     sleep(2); 
     unset($pids); 
     $pids=array(); 
     exec("pgrep 'php'",$pids); 
     echo (count($pids) %15 !=0 ?count($pids)." ":count($pids).PHP_EOL); 
    } 

    //execute self before exiting 
    exec('bash -c "exec nohup setsid php go_get.php >/dev/null 2>&1 &"'); 
    exit(); 
?> 

これはやり過ぎのビットのように思えるが、私はすでに(OPでのPHPスクリプトのような)データをこすりするためにPHPを使用して、なぜ制御スクリプトとしてPHPを使用していませんでしたか?

php go_get.php

をしてからちょうど終了するスクリプトの最初の反復を待つ:

基本的には、このようなスクリプトを呼び出します。その後、バックグラウンドで実行されます。コマンドラインからピットカウントを使用するか、htopのような同様のツールを使用するかどうかを確認できます。

魅力的ではありませんが、機能します。 :)

関連する問題