在linux中使用wait执行两个命令

时间:2015-08-03 11:52:53

标签: linux bash terminal

我想编写一个执行以下命令的脚本:

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

提供以下输出 - 在"服务器在线1111"出现在屏幕上我想发出另一个命令./isql 1111 dba dba。我不想发出命令" ./ isql 1111 dba dba"之前"服务器在线1111"出现在屏幕上 - 命令./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

对它执行查询

3 个答案:

答案 0 :(得分:2)

您可以合理地等到线出现,方法是将输出发送到文件并轻击......

#!/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. 检查服务器是否处于活动状态,因此启动失败不会导致无限等待。
  4. 编辑:

    Bash支持new [[ ... ]]old [ ... ]条件表单。较新的是首选,但如果您的shell不支持它,请尝试旧的。

    我认为,/bin/bash真的不是真的可能会尝试运行/bin/bash --version来查看。如果它是一个更简单的shell,#!/usr/bin/bash可能会有效。

答案 1 :(得分: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

答案 2 :(得分: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";是可选的(只是文字状态)