免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2960 | 回复: 9
打印 上一主题 下一主题

[求助] jsp中执行shell脚本无法更改环境变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-19 10:01 |只看该作者 |倒序浏览

  1.   int exitVal = -2;
  2.   String cmd0 = "sudo -u someUser /pathTo/diskspace.sh";
  3.   StringBuffer sb = new StringBuffer("");
  4.   try {
  5.     Runtime rt =Runtime.getRuntime();
  6.     Process proc = rt.exec(cmd0);
  7.     InputStream result = proc.getInputStream();
  8.     InputStreamReader isr = new InputStreamReader(result);
  9.     BufferedReader br = new BufferedReader(isr);
  10.     String line = null;
  11.     while ( (line = br.readLine()) != null)
  12.         sb.append(line).append("\n");
  13.     exitVal = proc.waitFor();
  14.   } catch (Exception ex) {
  15.     ex.printStackTrace();
  16.     exitVal = -1;
  17.   }
复制代码


现在服务器采用tomcat运行,tomcat用jsvc -jvm server启动,tomcat的启动脚本中指定了 LANG=zh_CN。

问题就在这里,diskspace.sh这个shell需要把 LANG设为 en_US 才能正常执行,

但我尝试在diskspace.sh中加入export LANG=en_US也不能执行,该shell脚本仍然按照zh_CN执行,于是我把LANG用echo打印出来,却是显示en_US,目前超级郁闷。

该程序在两台服务器上执行正常,第三台服务器出现此故障。

[ 本帖最后由 jhsea3do 于 2006-7-19 10:04 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-07-19 10:45 |只看该作者
我的调试过程大概是:

在 diskspace.sh 里 export 变量,并 diskspace.sh 里面显示一下变量看看,依然没变?

注意我说的是同在 diskspace.sh脚本里

假如显示出来的是还依然改变不了,不用jsp,直接执行  sudo -u someUser /pathTo/diskspace.sh

看效果,大概就能判断出来了

论坛徽章:
0
3 [报告]
发表于 2006-07-19 10:57 |只看该作者
楼上说得很有道理,我试了一下,果然是sudo的问题

现在正在研究解决办法。

论坛徽章:
0
4 [报告]
发表于 2006-07-19 11:08 |只看该作者
好像上面我说得不对。刚才又试验了一下

在 /pathTo/diskspace.sh 中加入代码  export LANG=en_US

root#export LANG=zh_CN
root#sudo -u someUser /pathTo/diskspace.sh

同jsp上运行不同的是,这次使用了LANG=en_US的环境变量,也就是说加入的那句代码生效了。


我觉得我碰到妖怪问题了。

问一下wobushiwo, Runtime.getRuntime()得到的rt能不能运行两条语句阿?

因为一条语句我已经试过了不行,
cmd0 = "export LANG=en_US; sudo -u someUser /pathTo/diskspace.sh"
cmd0 = "export LANG=en_US && sudo -u someUser /pathTo/diskspace.sh"

还有这样写也不行
Process proc = rt.exec("export LANG=en_US");
proc = rt.exec(cmd0);

[ 本帖最后由 jhsea3do 于 2006-7-19 11:09 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-07-19 11:15 |只看该作者
解决了,把env在jsp里打印了一下

原来有个LC_ALL=zh_CN.GBK在作怪

加了一个 export LC_ALL=en_US.UTF-8 总算解决了。

论坛徽章:
0
6 [报告]
发表于 2006-07-19 11:24 |只看该作者
继续补充

一共有3台服务器,2台linux,相同的配置部署。

都是tomcat5509,  j2sdk1.4.2_09

该问题只在 rhel 的服务器上出现, 另一台 rh8 没有此故障。

论坛徽章:
0
7 [报告]
发表于 2006-07-19 13:01 |只看该作者
Process proc = rt.exec("export LANG=en_US");
proc = rt.exec(cmd0);
两个exec就是两个独立的shell进程,不会互相干扰,所以没用。

如果用jdk5的话,用ProcessBuilder就可以设置环境变量了
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");
Process p = pb.start();

论坛徽章:
0
8 [报告]
发表于 2006-07-21 09:17 |只看该作者
谢谢版主介绍,我找了一下好像没有看到1.4的内容。

不过我就是想提醒各位,如果LC_ALL的变量存在,可能会影响LANG的设定。

论坛徽章:
0
9 [报告]
发表于 2006-07-21 09:54 |只看该作者
我只改LC_ALL的

论坛徽章:
0
10 [报告]
发表于 2006-07-21 12:02 |只看该作者
是了,刚才朋友让我看i18N的文章,在其技术规范里面定义了LC_ALL会覆盖所有本地化设定。

可以unset掉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP