【问题标题】:Execute two commands with wait in linux在linux中使用wait执行两个命令
【发布时间】:2015-10-25 12:23:43
【问题描述】:

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

./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 应该根据我的需要在不同的会话(屏幕等)中发出。 /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 似乎在“Server online at 1111”出现在屏幕上之前被执行。 python中是否有某种方式(通过调用python或c ++的命令或使用linux命令可以实现所需的行为?

命令“./virtuoso-t -f -c /home/var/lib/virtuoso/db/virtuoso.ini”没有终止,它保持在线,输出“Server online at 1111”和另一个终端我使用 ./isql 1111 dba dba 对其执行查询

【问题讨论】:

    标签: linux bash terminal


    【解决方案1】:

    我想出了这个,它逐行读取管道输出,直到找到您正在寻找的那个。

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

      您可以合理地等待该行出现,方法是将输出发送到文件并 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 支持 new [[ ... ]]old [ ... ] 条件形式。较新的是首选,但如果您的外壳不支持它,请尝试旧的。

      你的/bin/bash 可能不是真正的 bash,我想,尝试运行/bin/bash --version 看看。如果它是一个更简单的 shell,#!/usr/bin/bash 可能会工作。

      【讨论】:

      • 谢谢.. -d /proc/$PID 有什么作用.. 还有为什么当输出出现在屏幕上时我们还要查看日志
      • ok..我们是否使用 PID=$ 获取后台进程的进程 ID! ..如果不是那么它是怎么回事...我们也在使用 -d /proc/$PID
      • 当我执行这个时,我得到“ [[: not found”
      • 是的,我的 shell 是 bash,我使用 echo $0 检查了它给 /bin/bash。但我不知道为什么我会得到 [[: not found.我确实使用相同的第一行保存了脚本
      • 我应该使用...while // -d /proc/$PID && ! grep -q -m 1 "服务器在线"日志 //;
      【解决方案3】:

      您需要顺序命令。为此,请将您的命令与; 连接起来,如下所示:

       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"; 是可选的(只是文本状态)

      【讨论】:

      • 或更好,command1 && command2,这样如果command1 失败,command2 将不会被执行。
      • @fedorqui,好点,但据我所知,&& 考虑了第一个命令的返回值。如果成功,其中一些也会返回 0。这需要适当的分析。对于一般的“等到第一次完成”,我认为; 可以解决问题
      • 谢谢,但我的问题是第一个命令没有终止..它仍然存在输出“Server online at 1111”,我在另一个终端执行“./isql 1111 dba dba”..
      • 我的意思是 ./virtuoso-t 启动一个服务器..这是一个数据库引擎..它保持在线,屏幕上的输出“服务器在线 1111”,使用 ./isql 我可以执行查询在这台服务器上...现在我想在我的脚本中保持服务器在线并使用命令 ./isql 1111 dba dba 发出查询
      • @JannatArora,使用这个更新的答案,我能够成功等待 mysql 启动,然后在当前目录中运行“ls”。我认为这适合你的情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 2017-07-30
      • 2016-01-19
      • 2012-10-09
      • 2011-06-11
      • 2017-06-19
      相关资源
      最近更新 更多