案例:
我的情况很简单。我有一台Linux服务器机器。在该服务器上,有2个用户。一个是 root ,另一个是 oracle 。现在就是这样,root用户不知道 sqlldr 命令,此命令被 oracle 识别仅限用户。
我有 batch.sh 文件,在该文件中我有 sqlldr 命令,该命令将插入记录在数据库中。当我使用 oracle 用户打开终端时, batch.sh 文件会根据预期运行。但是当我使用 root 用户从终端运行该批处理文件时,它会显示" ./ batch.sh:line 3:sqlldr :找不到命令 "。
问题:
现在问题是,我从java代码调用这个batch.sh文件,这个java进程以 root 启动。我无法将此java进程切换到oracle。但是,我期待的是,我可以在 文件中使用 root < / strong>用户。
这是我的batch.sh文件内容。
#!/bin/bash
sqlldr username/password@sid control='/path/toFile/control.txt' log='/path/toFile/Results.log' bad='/path/toFile/BadFile.bad' ERRORS=5000
exit 0
我期待这样的事情。
#!/bin/bash
### Start - Switch user here from root to oracle so that it recognize the following command
sqlldr username/password@sid control='/path/toFile/control.txt' log='/path/toFile/Results.log' bad='/path/toFile/BadFile.bad' ERRORS=5000
### End - Undo the switch that we made above
exit 0
任何帮助都将受到高度赞赏。
由于
答案 0 :(得分:1)
可执行文件sqlldr根本不在根的搜索路径中。因此,当您以root用户身份登录时,您将无法执行sqlldr。
你需要做的是找出sqlldr所在的位置(例如/ folderof / yourtool)并执行A或B:
A)确保将其包含在root登录时加载的根路径中,使用根据您的Linux发行版的方法
要么
B)将行PATH=$PATH:/folderof/yourtool
添加到shell脚本或java环境中以动态添加PATH。
答案 1 :(得分:1)
您也可以使用runuser
在您的脚本中以root用户身份运行该命令runuser -l oracle -c "sqlldr username/password@sid control='/path/toFile/control.txt' log='/path/toFile/Results.log' bad='/path/toFile/BadFile.bad' ERRORS=5000"