【问题标题】:Running multiple parallel sqlplus connections for a certain period of time in bash在bash中运行多个并行sqlplus连接一段时间
【发布时间】:2019-11-25 05:40:53
【问题描述】:

我有这段代码创建 20 个并行 sqlplus 实例,执行一些查询和退出:

   #!/bin/sh
    for i in $(seq 1 20);
    do
       echo "CREATE TABLE table_$i (id NUMBER NOT NULL);
       select * from table_$i;
       ! sleep 30
       select * from table_$i;
       ! sleep 30
       DROP TABLE table_$i;" | sqlplus system/password &
    done
    wait

如果可能,我需要调整此代码,使其在以下条件下运行一个小时:

始终保持 20 个连接,如果一个 sqlplus 实例关闭(完成它的过程)另一个应该打开,我需要在 X 时间内保持一定数量的连接。

我可以在这段代码中添加什么来满足我的需要吗?

【问题讨论】:

  • 创建一个以$i 为参数的函数,并在该函数中以date 开头并使用while 循环和sqlplus 运行直到小时结束。使用& 调用此函数 20 次并等待。
  • 你能给我看一个代码示例并解释它是如何工作的吗?

标签: linux bash shell ssh sqlplus


【解决方案1】:

对于一个小时内的循环,请参阅https://stackoverflow.com/a/22735757/3220113

runsql() {
   i="$1"
   end=$((SECONDS+3600))
   SECONDS=0
   while (( SECONDS < end )); do
      # Do what you want.
      echo "CREATE TABLE table_$i (id NUMBER NOT NULL);
            select * from table_$i;
            ! sleep 30
            select * from table_$i;
            ! sleep 30
            DROP TABLE table_$i;" | sqlplus system/password 
      sleep 1 # precaution when sqlplus fails, maybe wrong password
   done
}

for i in $(seq 1 20); do
   runsql $i &
done
wait

说明:
底部的主循环在后台启动函数runsql 20次。
函数runsql 可以在任何地方使用$1,我将它复制到i 以获得看起来像原始代码的代码。
SECONDS 是一个由 shell 每秒改变的计数器,所以我们不需要调用date
3600是一个小时。
(( .. )) 中,您可以在变量前面不带$ 的情况下进行数学运算。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2021-08-04
  • 2016-01-11
相关资源
最近更新 更多