5

特定の名前のスクリプトが実行されている頻度をカウントする小さなbashスクリプトに取り組んでいます。

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

私が使用するコードです。sshを介して、scrap_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

上記のスクリプトは私がこれまでに持っているものですが、機能しません。このエラーが発生します:

[root@s1 crons]# ./check_data.sh
./check_data.sh: line 4: [: missing `]'
wc: invalid option -- e

ifステートメントで何が間違っていますか?

4

4 に答える 4

7

テスト構文が正しくありませんlt。テストブラケット内にある必要があります。

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

pgrep scrape_data.php &> /dev/null

if [ $? ]; then
  echo no launch
fi
于 2012-09-12T17:30:32.037 に答える
2

を使用している場合はBash、ドロップ[して算術比較-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
于 2012-09-12T17:38:06.187 に答える
1

行を数える必要はありません。の戻り値を確認するだけですgrep

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

[s]トリックは。を回避しgrep -v grepます。

于 2012-09-12T17:38:15.920 に答える
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();
?>

これは少しやり過ぎのように思えますが、私はすでにPHPを使用してデータをスクレイピングしていたので(OPのphpスクリプトのように)、PHPを制御スクリプトとして使用してみませんか?

基本的に、次のようにスクリプトを呼び出します。

php go_get.php

次に、スクリプトの最初の反復が終了するのを待ちます。その後、バックグラウンドで実行されます。これは、コマンドラインまたはのような同様のツールからpidカウントを使用しているかどうかを確認できますhtop

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

于 2016-02-08T22:37:18.867 に答える