2012-09-12 13 views
5

द्वारा चल रही प्रक्रियाओं को गिनती है मैं एक छोटी बैश स्क्रिप्ट पर काम कर रहा हूं जो कि एक निश्चित नाम के साथ कितनी बार एक स्क्रिप्ट चल रहा है।सरल बैश स्क्रिप्ट नाम

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 

यदि मैं कथन में गलत कर रहा हूं?

उत्तर

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 
+0

धन्यवाद, यह काम किया! –

+0

मैं सेंटोस 6.5 पर हूं और मुझे यकीन नहीं है कि '-lt' मेरे लिए क्यों काम नहीं करता है, इसे मेरे लिए' -gt' कार्यों के साथ बदलता है। – hailong

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 
1

लाइनों की गणना करने की आवश्यकता नहीं है। बस की जाँच grep की वापसी मूल्य:

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

[एस] चाल 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(); 
?> 

अब जबकि इस overkill का एक सा की तरह लगता है, मैं पहले से ही पीएचपी डेटा (ओपी में अपने PHP स्क्रिप्ट की तरह) स्क्रैप करने का उपयोग कर रहा था, तो क्यों नियंत्रण स्क्रिप्ट के रूप में पीएचपी का उपयोग नहीं?

मूल रूप से, अगर आप इस तरह स्क्रिप्ट कहेंगे:

php go_get.php

और फिर बस स्क्रिप्ट का पहला यात्रा समाप्त होने की प्रतीक्षा। उसके बाद, यह पृष्ठभूमि में चलता है, जो आप देख सकते हैं कि क्या आप कमांड लाइन से अपने पिड गिनती का उपयोग करते हैं, या htop जैसे समान टूल का उपयोग करते हैं।

यह ग्लैमरस नहीं है, लेकिन यह काम करता है। :)

संबंधित मुद्दे