关于对Runtime.exec()方法的疑惑

oodick 2008-04-22 07:02:32
问题是这样的,我定义了一个String类型的数组,里面一共有5个字符串,每一个字符串本地测试都是可以正常运行得命令(linux下得),然后我通过for循环一次执行这个数组里面的命令的时候,有部分能成功运行,但是有一部分就无法正常运行,再次将无法执行得命令 拿到shell里面手工确认,却发现是正常的,百思不得其解,请教各位高手! 附部分代码:


String [] cmd = {"mv -f ./template/" + ftpname +".conf " + "/usr/local/httpd/vhost.d/" ,
"cp -rf ./template/tomcat/* " + "/var/www/virtual/" + ftpname +"/",
"adduser " + ftpname + " -d /var/www/virtual/" +ftpname ,
"echo " + "\"" +ftpname+":"+ftppass +"\"" +" | chpasswd",
"chown -R " + ftpname +":" + ftpname + " /var/www/virtual/" + ftpname +"/"};
for (int i = 0; i < cmd.length; i++) {
System.out.println(cmd[i]);
p = run.exec(cmd[i]);
p.waitFor();
}


请教各位下关于exec() 这个方法 到底应该怎么用,才能保证命令一条一条正常运行????万分感谢
...全文
198 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
caibaoying 2008-04-24
  • 打赏
  • 举报
回复
要不分字符串拼接下````````
lixiaoxue85 2008-04-22
  • 打赏
  • 举报
回复
Runtime.exec()确实会遇到这种问题.所以不要把Runtime.exec()等同于手工运行.建议把命令放到SHELL里后
Runtime.exec()直接跑SHELL. 导致不稳定的原因有很多,操作系统.权限.执行完一个命令在等候
panxuan 2008-04-22
  • 打赏
  • 举报
回复
关注!
老紫竹 2008-04-22
  • 打赏
  • 举报
回复
难道只有你的
System.out.println(cmd[i]);
输出了?
我的那一大段啥也没有输出吗???

太奇怪了吧!!!
oodick 2008-04-22
  • 打赏
  • 举报
回复
[root@localhost test]# cp -rf ./template/tomcat/* /var/www/virtual/zizhulaoda/ [root@localhost test]# ls /var/www/virtual/zizhulaoda/
conf logs server shared temp webapps work
我在shell里面执行就可以正常运行 已经将文件复制过去,
chenhongxin 2008-04-22
  • 打赏
  • 举报
回复
String[] cmd = { "mv -f ./template/" + ftpname + ".conf " + "/usr/local/httpd/vhost.d/",
"cp -rf ./template/tomcat/* " + "/var/www/virtual/" + ftpname + "/",
"adduser " + ftpname + " -d /var/www/virtual/" + ftpname,
"echo " + """ + ftpname + ":" + ftppass + """ + " | chpasswd",
"chown -R " + ftpname + ":" + ftpname + " /var/www/virtual/" + ftpname + "/" };
Process p;
for (int i = 0; i < cmd.length; i++) {
System.out.println(cmd[i]);
p = run.exec(cmd[i]);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = "";
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
oodick 2008-04-22
  • 打赏
  • 举报
回复

mv -f ./template/zizhulaoda.conf /usr/local/httpd/vhost.d/
cp -rf ./template/tomcat/* /var/www/virtual/zizhulaoda/
adduser zizhulaoda -d /var/www/virtual/zizhulaoda
echo "zizhulaoda:zizhulaoda" | chpasswd
"zizhulaoda:zizhulaoda" | chpasswd
chown -R zizhulaoda:zizhulaoda /var/www/virtual/zizhulaoda/


这个输出和我的一样,但是就是不行,第2个,第4个没有执行
老紫竹 2008-04-22
  • 打赏
  • 举报
回复
输出结果呢?我那个有输出的,贴出来看看!
oodick 2008-04-22
  • 打赏
  • 举报
回复
紫竹老大,你给得代码我也测试过了,和我遇到得情况是一样的,确实每次都是 "echo " + """ + ftpname + ":" + ftppass + """ + " | chpasswd",
这条运行不了 还有cp -rf ./template/tomcat/* " + "/var/www/virtual/" + ftpname + "/", 这条, 诶。。我通宵搞了一个晚上了,之前cp -rf ./template/tomcat/* " + "/var/www/virtual/" + ftpname + "/", 这条还可以运行,后来把 "echo " + """ +...这个加上,结果就出问题了。。。。。晕死,不知道老大还有没好的办法?谢谢先
KKK2007 2008-04-22
  • 打赏
  • 举报
回复
有可能是权限问题,你在shell里运行是一个linux帐户,在 java程序里运行,可能那个java程序属于另一个帐户
而这个帐户没有运行某个命令的权限
zhengpeiyong 2008-04-22
  • 打赏
  • 举报
回复
这几个指令有没有先后关系啊?
或者会不会运行了第一个,而第二个使用的端口已经被占用,所以不能运行?
分开运行试试吧。
老紫竹 2008-04-22
  • 打赏
  • 举报
回复
有部分能成功运行,但是有一部分就无法正常运行

到底是哪些呢?

是不是每次都是他们?
如果是,那就在java里单独运行他们看看

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
public static void main(String[] args) throws IOException {
String ftpname = null;
String ftppass = null;
Runtime run = Runtime.getRuntime();
String[] cmd = { "mv -f ./template/" + ftpname + ".conf " + "/usr/local/httpd/vhost.d/",
"cp -rf ./template/tomcat/* " + "/var/www/virtual/" + ftpname + "/",
"adduser " + ftpname + " -d /var/www/virtual/" + ftpname,
"echo " + """ + ftpname + ":" + ftppass + """ + " | chpasswd",
"chown -R " + ftpname + ":" + ftpname + " /var/www/virtual/" + ftpname + "/" };
Process p;
for (int i = 0; i < cmd.length; i++) {
System.out.println(cmd[i]);
p = run.exec(cmd[i]);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = "";
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
p.destroy();
}
}
}
oodick 2008-04-22
  • 打赏
  • 举报
回复
紫竹老大, 只输出了 :"zizhulaoda:zizhulaoda" | chpasswd
你仔细看看上面的,就这个是通过你写得输出流输出得

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧