চালিয়ে যাওয়ার আগে বাশ স্ক্রিপ্ট স্থিতি বার্তার জন্য অপেক্ষা করুন


10

আমি ব্যাশ স্ক্রিপ্টের সাহায্যে সেলেনিয়াম সার্ভারটি ফায়ার করছি এবং আপনি নীচের লগটিতে টাইমস্ট্যাম্পগুলি থেকে দেখতে পাচ্ছেন, জিনিসটি সম্পূর্ণভাবে অনলাইনে আসতে 32 সেকেন্ড সময় নেয়:

Feb 28, 2012 10:19:02 PM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a standalone server
22:19:02.835 INFO - Java: Sun Microsystems Inc. 20.0-b11
22:19:02.836 INFO - OS: Linux 2.6.32-220.4.1.el6.x86_64 amd64
22:19:02.852 INFO - v2.19.0, with Core v2.19.0. Built from revision 15849
22:19:02.988 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
22:19:02.990 INFO - Version Jetty/5.1.x
22:19:02.992 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
22:19:02.993 INFO - Started HttpContext[/selenium-server,/selenium-server]
22:19:02.993 INFO - Started HttpContext[/,/]
22:19:34.552 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@488e32e7
22:19:34.552 INFO - Started HttpContext[/wd,/wd]
22:19:34.555 INFO - Started SocketListener on 0.0.0.0:4444
22:19:34.555 INFO - Started org.openqa.jetty.jetty.Server@7d29f3b5

সার্ভারটি শুরু করার পরে "স্লিপ 32" কমান্ডটি ব্যবহার না করে (এগিয়ে যাওয়ার আগে স্ক্রিপ্টটি বিলম্ব করার জন্য), আমি আমার বাশ স্ক্রিপ্টটি "স্টার্টড সকেটলিস্টনার" স্ট্রিংটি না দেখা পর্যন্ত অপেক্ষা করা এবং তারপরে চালিয়ে যেতে চাই। এটা কি সম্ভব?

উত্তর:


8

tail -fফাইলটি বড় হওয়ার সাথে সাথে আপনি পড়া চালিয়ে যেতে পারেন । আপনি যা খাওয়ান সে সম্পর্কে সাবধান হন tail -f। আপনি tail -fএমন ফিল্টারটি পাইপ করতে পারেন যা পছন্দসই লগ লাইন এবং প্রস্থান না হওয়া অবধি অপেক্ষা করে। আপনি যদি tail -fএকটি ফিল্টারটি পাইপ করেন যা কোনও অন্য ফিল্টারকে পাইপ করে তবে কী কাজ করবে না তা হ'ল কারণ মধ্যবর্তী ফিল্টারটি তার আউটপুটটি বাফার করবে। এইটা কাজ করে:

: >file.log  # create an empty log file
start-selenium-session --log-file=file.log &
{ tail -n +1 -f file.log & } | sed -n '/Started SocketListener/q'
speak-to-socket

নোট করুন যে আমি tailব্যাকগ্রাউন্ডে রেখেছি । এর কারণ এটি যখন sedপছন্দসই লাইনটি পাওয়া যায়, tailএটিটি প্রস্থান করে তবে পাইপলাইনটি পরবর্তী লাইনের জন্য যতক্ষণ অপেক্ষা করছে ততক্ষণ চলতে থাকবে , যা যদি ঠিক তখনই না আসে ¹ tailযখন পরের লাইনটি আসবে এবং প্রস্থান করবে এটি a SIGPIPE। এটি কোনও বিভ্রান্তিকর tailপ্রক্রিয়া ছেড়ে দিতে পারে যদি লগটি কোনও লিখিত না লিখেই মুছে ফেলা হয় ( প্রস্থানটির পিআইডি অর্জন করার tailসময় এটি sedনির্মূল করা সম্ভব হবে তবে তাত্পর্যপূর্ণ হতে পারে)।

¹ ধন্যবাদ Peter.O আগের সংস্করণে বাগ ইশারা জন্য।


একটি নোট (পেডেন্ট্রি, সম্ভবত) - আমি কোনও শেল জানি না যার জন্য খালি ফাইল লেখার অনুমতি দেওয়ার জন্য আসলে নূপুরের প্রয়োজন
ক্রিস ডাউন

@ ক্রিসডাউন উভয়ই আমি করি না I তবে আমি স্পষ্টভাবে নো-অপশনটি লিখতে আরও স্পষ্ট মনে করি।
গিলস 'অশুভ হওয়া বন্ধ করুন'

চমৎকার (+1) ... বাফারদের কথা বলছি: আমি বাফারিংয়ের কৌশলগুলি বুঝতে পারি না, তবে লক্ষ্য লাইনটি যদি তত্ক্ষণাত আরও লগ লাইন অনুসরণ না করে তবে এটি সম্পর্কে সচেতন হওয়ার একটি বিষয় রয়েছে। এটি ঝুলিয়ে দেওয়া হয়েছে যতক্ষণ না আরও লাইন লেখা হয়, যদিও সেড ইতিমধ্যে প্যাটার্নটির সাথে মেলে (<- আমি সেই অংশটি বুঝতে পারি না)। একটি পরিবর্তিত sedকমান্ড যা ফ্লাশ (?) কে জোর করার জন্য লগকে যথেষ্ট লিখেছে, তা অবিলম্বে এটি চালু করবে (আমি এটি পরীক্ষা করেছি), তবে আমি মনে করি যে dataোকানো তথ্যগুলি সেলেনিয়াম-সেশনের লাইনের সাথে ছেদ করার সম্ভাবনা রয়েছে .. ।
পিটার.ও

@ পিটার.ও আইআইআরসি কিছু সেড বাস্তবায়ন পরবর্তী লাইনটি আগেই পড়বে, কারণ এটির ক্ষেত্রে দরকারী এমন একটি মামলা রয়েছে (এটির $জন্য ঠিকানা)। যদিও আমি (জিএনইউ সেড সহ) আমার পরীক্ষাগুলিতে এমনটি ঘটতে দেখিনি। আপনি কীভাবে বাগটি প্রদর্শন করেছেন, কোন ওএসে?
গিলস 12'7 এ 12

@ গিলস: পেস্ট.বুন্টু . com/ 863326 .. এবং: জিএনইউ সেড সংস্করণ 4.2.1 , লেজ (জিএনইউ
কোর্টিল

3

সোজা শেল স্ক্রিপ্টে এটি কিছুটা শক্ত, তবে টমক্যাট এবং oc4j এর জন্য আমি বেশ কিছুদিন ধরে এটি ব্যবহার করছিলাম:

perlscr='
alarm 120;
open F, "<$ARGV[0]";
seek F -($ARGV[1]*80),2;
while (1) {exit if (<F>=~$ARGV[2]);}'

window=10
scanfor="^INFO: Server startup in \d+ ms"
perl -e "$perlscr" $logfile $window "$scanfor" 2>&1 0<&1

alarmকোনো সম্ভাব্য ঝুলন্ত যেখানে হুল বিড়াল ব্যর্থ হ্যান্ডেল করবে। ইওএফ থেকে ফিরে যাওয়ার লাইনের সংখ্যাটি সামঞ্জস্যযোগ্য (কোনও কনফিগার ফাইল থেকে)।

অবশেষে আমি পুরো জিনিসটি অজগরে সরিয়ে নিয়েছি; যদিও এটি কিছুটা দীর্ঘ, এটি কিছুটা দক্ষ

class Alarm:
    import signal
    signal_signal = signal.signal
    signal_SIGALRM = signal.SIGALRM
    signal_SIG_DFL = signal.SIG_DFL
    del signal
    def __init__(self, delay)
       self.howlong = delay
       self.clear()
    def __del__(self):
       self.reset_signals()
    def __nonzero__(self):
       return self.state
    def clear(self):
       self.state = False
       self.reset_signals()
    def _start_alarm(self):
       from signal import alarm
       alarm(self.howlong)
    def _set_sigalarm(self, handler):
        if handler:
            self.signal_signal(self.signal_SIGALRM, handler)
        else:
            self.signal_signal(self.signal_SIGALRM, self.signal_SIG_DFL)
    def reset_signals(self):
        self._set_sigalarm(None)
    def set_signals(self):
        self._set_sigalarm(self.handler)
    def handler(self, signo, frame):
        self.state = False
    def start(self):
        self.state = True
        self.set_signals()
        self._start_alarm()
    def stop(self):
        self.reset_signals()
        self.state = False
found = False
scanfor = re.compile('^INFO: Server startup in \d+ ms')
window = 10
logfile = open(logfilename, 'r')
logfile.seek(window * 80, 2)
alarm = Alarm(timeout)
try:
    alarm.start()
    while alarm:
        line = logfile.readline()
        if line:
            m = scanfor.search(line)
            if m:
                alarm.stop()
                found = True
                break
        time.sleep(0.1)
finally:
    alarm.clear()

1

বিরতি বাস্তবায়ন করতে আপনি এটি আপনার স্ক্রিপ্টে যুক্ত করতে পারেন:

perl -e 'use File::Tail;
    my $ref=tie *FH,"File::Tail",(name=>"/var/log/messages",maxinterval=>1);
    while(<FH>) { exit if /Started SocketListener/ };'

এটি পার্ল ফাইল :: লেজ মডিউলটির মতো আচরণের জন্য ব্যবহার করে tail -f logfile | grep Started SocketListener

/ Var / লগ / বার্তাটি উপযুক্ত লগ ফাইলের সাথে প্রতিস্থাপন করুন। মনে রাখবেন যে "স্টার্টড সকেটলিস্টনার" কখনই উপস্থিত না হলে এটি চিরতরে স্তব্ধ হয়ে যাবে।


1

অনির্দিষ্টকালের জন্য অপেক্ষা করার পরিবর্তে আপনার একটি সময়সীমা ব্যবহার করা উচিত।

প্রদত্ত অনুসন্ধান শব্দটি উপস্থিত না হওয়া বা প্রদত্ত সময়সীমা না আসা পর্যন্ত নীচে বাশ ফাংশনটি অবরুদ্ধ থাকবে।

সময়সীমার মধ্যে স্ট্রিংটি পাওয়া গেলে প্রস্থান স্থিতি 0 হবে।

wait_str() {
  local file="$1"; shift
  local search_term="$1"; shift
  local wait_time="${1:-5m}"; shift # 5 minutes as default timeout

  (timeout $wait_time tail -F -n0 "$file" &) | grep -q "$search_term" && return 0

  echo "Timeout of $wait_time reached. Unable to find '$search_term' in '$file'"
  return 1
}

সম্ভবত সেলেনিয়াম চালু করার পরে লগ ফাইলটির অস্তিত্ব এখনও নেই। সেক্ষেত্রে আপনার স্ট্রিংটি অনুসন্ধানের আগে এটি উপস্থিত হওয়ার জন্য অপেক্ষা করা উচিত:

wait_selenium_server() {
  echo "Waiting for Selenium server..."
  local server_log="$1"; shift
  local wait_time="$1"; shift

  wait_file "$server_log" 10 || { echo "Selenium log file missing: '$server_log'"; return 1; }

  wait_str "$server_log" "Started SocketListener" "$wait_time"
}

wait_file() {
  local file="$1"; shift
  local wait_seconds="${1:-10}"; shift # 10 seconds as default timeout

  until test $((wait_seconds--)) -eq 0 -o -f "$file" ; do sleep 1; done

  ((++wait_seconds))
}

আপনি এটি কীভাবে ব্যবহার করতে পারেন তা এখানে:

wait_selenium_server "/var/log/selenium.log" 5m && \
echo -e "\n-------------------------- Selenium READY --------------------------\n"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.