您的位置:首页 > 运维架构 > Shell

Java调用shell脚本要注意工作目录

2013-01-29 11:49 447 查看
最近在一个web项目中要调用shell脚本,

把当天生产的一个文件推送到另一台机器上去,

脚本内容大致如下:

#!/bin/bash
for i in `cat aa`
do
date=`date +%Y_%m_%d`
file=${date}_some.gz
/bin/cp $file some.gz >> copy.log 2>&1 && /usr/bin/scp some.gz admin@192.168.3."$i":/path/to/go >> copy.log 2>&1
sleep 0.1
done


java程序片段如下:

Process pid = null;
String[] cmd = {"/bin/sh", "-c", shellCommand};
//执行Shell命令
return Runtime.getRuntime().exec(cmd).waitFor();


手动执行脚本时没有任何问题,

但是通过Runtime.exec执行是却总是看不到不到结果,

copy.log里也没有任何信息。

后来把脚本改成如下:

#!/bin/bash
echo "Start" >> copy.log
path="/path/from/"
target="some.gz"
source="$(date +%Y_%m_%d)_${target}"
/bin/cp -vf "${path}${source}"  "${path}${target}" >> copy.log 2>&1
if [ $? -eq 1 ]
then
exit 1
fi
/bin/cp -vf "${path}${target}" hello.gz >> copy.log 2>&1
if [ $? -eq 1 ]
then
exit 1
fi
echo "End" >> copy.log


再次调用脚本,

/path/from/目录下确实生成了some.gz文件,

但是没有hello.gz,

而且 copy.log 里也没有我直接 echo 的信息。

后来转到 tomcat/bin 目录下发现了 copy.log 和 hello.gz。

原来是工作目录的原因,

第一个脚本里的文件用的是相对路径,

java web 程序调用时的工作目录是 tomcat/bin,

在tomcat/bin下自然找不到 yyyy_MM_dd_some.gz,

而且错误信息日志 copy.log也在 tomcat/bin中,

所有在 /path/from 下的copy.log里自然找不到错误信息。

解决方案有二:

0,在脚本里写绝对路径

1,java调用脚本时传递工作目录(我猜的,没测试不知好不好使)(经测试,可用!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: