2015-08-03 51 views
0

與等待執行兩個命令我想寫一個腳本,執行以下命令:在linux

./virtuoso-t -f -c /home/var/lib/virtuoso/db/virtuoso.ini 

這給下面的輸出 - 後「服務器在線1111」出現在屏幕上我要發佈另一個命令./isql 1111 dba dba。我不想在屏幕上出現「Server online at 1111」之前發出命令「./isql 1111 dba dba」 - 命令./isql 1111 dba dba應該根據需要在不同的會話(屏幕等)中發佈。 /演奏家-T保持在線,同時我執行我的命令 - 是有一些辦法讓我可以實現同樣的

 Mon Aug 03 2015 
17:08:49 { Loading plugin 1: Type `plain', file `wikiv' in `/home/jyotil/VirtuosoHugh/virtuosoInstalled/lib/virtuoso/hosting' 
17:08:49 FAILED plugin 1: Unable to locate file } 
17:08:49 { Loading plugin 2: Type `plain', file `mediawiki' in `/home/jyotil/VirtuosoHugh/virtuosoInstalled/lib/virtuoso/hosting' 
17:08:49 FAILED plugin 2: Unable to locate file } 
17:08:49 { Loading plugin 3: Type `plain', file `creolewiki' in `/home/jyotil/VirtuosoHugh/virtuosoInstalled/lib/virtuoso/hosting' 
17:08:49 FAILED plugin 3: Unable to locate file } 
17:08:49 OpenLink Virtuoso Universal Server 
17:08:49 Version 07.20.3213-pthreads for Linux as of Apr 10 2015 
17:08:49 uses parts of OpenSSL, PCRE, Html Tidy 
17:08:59 Database version 3126 
17:09:00 SQL Optimizer enabled (max 1000 layouts) 
17:09:01 Compiler unit is timed at 0.000687 msec 
17:09:38 Roll forward started 
17:09:38 Roll forward complete 
17:09:52 Checkpoint started 
17:09:54 Checkpoint finished, log reused 
17:09:57 HTTP/WebDAV server online at 8890 
17:09:57 Server online at 1111 (pid 4972) 

對於這樣我在(myScript.sh)寫了下面的shell腳本:

./virtuoso-t -f -c /home/var/lib/virtuoso/db/virtuoso.ini 
./isql 1111 dba dba 

但是看起來./isql 1111 dba dba在屏幕上出現「Server online at 1111」之前被執行。有沒有在Python中的某種方式(通過調用python或C++的命令或使用linux命令,我可以達到所需的行爲?

命令「./virtuoso-t -f -c/home/var/lib/virtuoso/db/virtuoso.ini「不會終止,它仍然保持在線狀態,輸出爲」服務器在線1111「,而在另一個終端上,我使用它執行查詢./isql 1111 dba dba

回答

1

需要連續命令爲了實現這一目標,與;串連你的命令,就像這樣:

sleep 5s ; ls 

你會發現,目錄列表在sleep完成後發生。

爲了滿足您的特定例如,運行:

./virtuoso-t -f -c /home/var/lib/virtuoso/db/virtuoso.ini ; ./isql 1111 dba dba 

要測試您的服務器已啓動,適應下面的代碼,你需要什麼。它採用netstat檢查主機上開放的端口:

while netstat -lnt | awk '$4 ~ /:3306$/ {print "running"; system("ls"); exit 1}'; do sleep 2s; done 

注:我在聽一個MySQL服務器(3306端口 - 你需要1111)
更換system("ls")system("sh /full/path/to script")
print "running";是可選的(只是文本狀態)

+0

或更好,'command1 && command2',這樣'command2'將不執行,如果command1'失敗。 – fedorqui

+0

@fedorqui,好點,但據我所知,'&&'考慮了第一個命令的返回值。並且其中一些在成功的情況下也返回0。這需要適當的分析。對於一般的「等待,直到第一次完成」,我認爲';'的技巧 –

+0

謝謝,但我的問題是第一個命令不終止..它仍然與輸出「服務器在線1111」,我執行「。/isql 1111 dba dba「在另一個終端中。 –

2

你可以合理地等到出現的線,通過發送輸出到文件和grepping ...

#!/bin/bash 
./virtuoso-t -f -c /home/var/lib/virtuoso/db/virtuoso.ini > log 2>&1 & 
PID=$! 
while [[ -d /proc/$PID && ! grep -q -m 1 "Server online at" log ]]; 
do 
    sleep 1; 
done 
./isql 1111 dba dba 

此:

  1. 運行在服務器作爲後臺進程(&)和
  2. 環路,直到服務器發射所需的信息到該文件
  3. 檢查服務器是活其輸出重定向到一個文件中,所以失敗的啓動不會導致無限的等待。

編輯:

猛砸同時支持new[[ ... ]]old[ ... ]條件表格。較新的是首選,但如果你的shell不支持它,請嘗試舊的。

這可能是你的/bin/bash不是真的bash,我想試試看/bin/bash --version。如果這是一個更簡單的外殼,#!/usr/bin/bash可能工作。

+0

謝謝..什麼是-d/proc/$ PID的..也爲什麼我們看日誌當輸出出現在屏幕上 –

+0

ok ..我們得到後臺進程的進程ID使用PID = $! ..如果不是那麼它是什麼所以...我們也是我們使用-d/proc/$ PID –

+0

當我執行這個我得到「[[:未找到」 –

2

我想出了這個,它一行一行地讀取管道輸出,直到找到你要找的那個。

#!/bin/bash 

virtuoso-t -f -c /home/var/lib/virtuoso/db/virtuoso.ini 2>&1 | while read line 
do 
    echo $line 
    if echo $line|grep 'Server online at 1111' > /dev/null; then 
     isql 1111 dba dba 
    fi 
done