- 论坛徽章:
- 1
|
本帖最后由 liuyeid 于 2015-02-05 18:58 编辑
假设下面的脚本中连接数据库的语句单独在shell中敲都是对的
脚本1:
#!/bin/bash
db2 connect to dbname user dbuser using password
db2 -m "select * from test"
这个脚本无论在什么环境下执行都没有问题
脚本2:
#!/bin/bash
db2 connect to dbname user dbuser using password
msg=`db2 -m "select * from test"`
这个脚本在某些环境下(可能是同一个操作系统只是不同物理机)执行会报passwrod missing reason code3 的这个错误
我遇到的情况是: 在两台机器上,都是readhat 5.1的系统,装的是相同版本的db2. 实际中db2 -m 执行的是export命令。但是例子为了简单
换为了select,但是应该不影响
问题应该是找到了,但是却不大理解将脚本2 该为如下:
脚本3:
#!/bin/bash
msg=`db2 connect to dbname user dbuser using password;db2 -m "select * from test"`
为了理解,说明下,一下说的 第一条命令就是指脚本1或脚本2的db2 connect命令,第二条就是db2 select命令
假设执行脚本(不管是脚本1还是脚本2)的时候进程id pid=1000,脚本1 的第一条命令 和 第二条命令的 父进程id ppid都是1000.
脚本2的第一条命令 ppid是1000, 第二条命令却不是1000,则说明`` 是pid=1000的进程fork了之后,子进程在fork的
db2 如果是在不同物理机做连接,肯定是走socket,我们就假设数据库连接就表示为1个socket的fd,但是shell中执行命令都是fork之后调用exec的,这样会把从父进程继承的fd给丢掉啊。当然这些信息可以保存共享内存或者db2起的服务程序中。
其实说了一大推是我自己的分析,我也不大理解为什么会出现脚本2的报错。这可能和环境变量的设置有关。但是export了环境变量都是继承下去的啊?
有谁能解析下吗,脚本2为什么会报错,而报错之后改为脚本3 就行了。
==================
更正:
上面脚本1 脚本3 脚本3 都是没有问题的。我自己没有认真分析就发上来了,不好意思
脚本1:
#!/bin/bash
db2 connect to dbname user dbuser using password
msg=`db2 -m "select * from test" 2&>1 `
或者
msg=`db2 -m "select * from test" > log.txt `
或者
msg=`db2 -m "select * from test" | tee -a log.txt`
脚本2:
#!/bin/bash
msg=`db2 connect to dbname user dbuser using password;db2 -m "select * from test" 2&>1 `
或者
msg=`db2 connect to dbname user dbuser using password;db2 -m "select * from test" > log.txt `
或者
msg=`db2 connect to dbname user dbuser using password;db2 -m "select * from test" | tee -a log.txt`
脚本1 有问题,会报Password missing reason "3" 的错误
脚本2 没有问题,为什么加了重定向和管道就有问题?
|
|