最近在一个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调用脚本时传递工作目录(我猜的,没测试不知好不好使)(经测试,可用!)