我想编写一个执行以下命令的脚本:
./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
对它执行查询答案 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)
我想出了这个,它逐行读取管道输出,直到找到你要找的那个。
#!/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";
是可选的(只是文字状态)