簡體   English   中英

在Linux中使用wait執行兩個命令

[英]Execute two commands with wait in linux

我想編寫一個執行以下命令的腳本:

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

它給出以下輸出-屏幕上出現“ 1111服務器聯機”后,我要發出另一個命令./isql 1111 dba dba。 我不想在屏幕上出現“ 1111在線服務器”之前發出命令“ ./isql 1111 dba dba”-我應該在不同的會話(屏幕等)中發出命令./isql 1111 dba dba。 / virtuoso-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在屏幕上顯示“ 1111的服務器在線”之前已執行。 python中是否有某種方法(通過從python或c ++調用命令,或使用linux命令可以達到預期的性能?

命令“ ./virtuoso-t -f -c /home/var/lib/virtuoso/db/virtuoso.ini”不會終止,它與輸出“ 1111的服務器聯機”保持聯機,並且在另一個終端中執行查詢使用./isql 1111 dba dba

通過將輸出發送到文件並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. 檢查服務器是否正常運行,因此啟動失敗不會導致無限等待。

編輯:

Bash同時支持新的 [[ ... ]]舊的 [ ... ]條件格式。 較新的是首選,但是如果您的外殼不支持它,請嘗試舊的。

我想,您的/bin/bash可能不是真正的bash,請嘗試運行/bin/bash --version進行查看。 如果它是一個更簡單的外殼,則#!/usr/bin/bash可能有效。

我想到了這一點,它逐行讀取管道輸出,直到找到所需的輸出為止。

#!/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

您需要順序命令。 為此,請使用;連接您的命令; , 像這樣:

 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("sh /full/path/to script")替換system("ls") system("sh /full/path/to script")
print "running"; 是可選的(僅文本狀態)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM