如何执行shell脚本以通过Java在Linux中通过sudo命令启动服务 例如:cmd =" sudo path / script.sh start"
这个Java程序将在linux中执行命令。 即使我能够做到“sudo ls -lt path'以及' sudo path / script.sh start'
//Java
public List<String> sshConnection(String usr,String host,int port,String pass)
{
Session session=null;
List<String> outputList = new ArrayList<String>();
try
{
JSch jsch = new JSch();
session = jsch.getSession(usr, host, port);
session.setPassword(pass);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
//String cmd="sudo ls path"; //working fine
String cmd="sudo path/script.sh start"; //service is not starting..but getting the exact output as linux
ChannelExec channelEx=new ChannelExec();
channelEx = (ChannelExec) session.openChannel("exec");
if(cmd.contains("sudo"))
{
channelEx.setPty(true);
}
((ChannelExec) channelEx).setCommand(cmd);
channelEx.connect();
InputStream cmdOp = channelEx.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(cmdOp));
String printOp;
while ((printOp = br.readLine()) != null)
{
outputList.add(printOp);
}
br.close();
channelEx.disconnect();
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
finally
{
if (channelEx != null)
{
channelEx.disconnect();
}
}
if(session!=null)
{
session.disconnect();
}
System.out.println("disconnected successfully");
return outputList;
}
我直接在linux中执行了相同的命令并得到一个输出,告诉“服务正在运行”。使用进程id。当我使用ps命令为进程ID执行grep时,它显示具有相同进程ID的服务。 但是当我通过上面的Java程序执行相同的命令时,我得到了输出控制台中具有进程ID的确切输出(&#39;服务正在运行&#39;)作为linux。在执行java程序之后,我做了grep对于linux中的进程ID(来自Java输出控制台),没有使用该进程ID运行此类进程。 我无法找到它出错的地方 请帮忙!
答案 0 :(得分:1)
您正在启动该流程,然后立即终止流程树。
尝试使用
channelEx.setPty(false);
或者将 nohup 添加到命令行。见...
jsch ChannelExec run a .sh script with nohup "lose" some commands
答案 1 :(得分:-1)
我能够以root用户身份启动命令,并在Java代码退出后查看进程ID。
channelExec.setCommand("sudo -S -p '' " + cmd);
nohup start.sh
)export
命令为脚本设置了所有环境变量。