我设置了一个脚本来运行许多任务,其中之一是在数据库中设置一个表,然后将其删除(用于自动化测试)。
问题是,只有少数用户使用该su - user -c
命令,对 db2 的调用失败。然而奇怪的是,使用su - user
然后运行 db2 命令工作正常(在脚本之外)。这种情况仅在我运行脚本一次之后以及在脚本运行过程中发生(尽管我看不到任何东西会导致它以某种方式改变任何内容,遗憾的是我无法分享确切的代码,尽管我可以分享一个示例/娱乐)如果有帮助的话),它只包含一些基本循环和一堆su - user -c
调用 IBM mq 命令的命令。
例如这会失败:
su - user -c "db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"
错误:
DB21016E The Command Line Processor encountered a system error while sending the command to the backend process.
DB21018E A system error occurred. The command line processor could not continue processing.
然而这工作正常:
su - user
db2 connect to database USER user USING pass
db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'
我尝试在这两种情况下输出 env 命令,看看是否有什么不同,但它们符合预期。我还尝试过调整不同用户运行的顺序,但这似乎也没有帮助。
我真的很困惑,任何帮助将不胜感激。
我正在使用 ksh shell。
答案1
我有一个似乎有效的解决方法。
我创建了一个单独的 ksh 脚本,执行所有 db2 命令(建立连接,然后创建表并授予其权限),并使用所需的任何参数运行该脚本。
这意味着尽管使用了 -c 部分,它还是在一个 su 实例中运行一组命令,以便在脚本内有效地运行它。
答案2
su - user
问题是使用和运行命令的环境su - user -c
可能有所不同,并且db2
需要一些缺少的变量(例如DB2INSTANCE
设置)才能正常工作。比较输出:
$ su - user
# printenv
和
$ su - user -c printenv
然后您可以像这样简单地传递缺失的变量:
$ su - user -c "export DB2INSTANCE=inst ; db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"