0

我想执行重命名和删除功能,环境是 LINUX。这是我正在使用的代码,

String[] command_ary = { "/usr/bin/sh", "-c", command };
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec( command_ary );

但我收到以下错误消息,

java.io.IOException: Cannot run program "/usr/bin/sh": java.io.IOException: error=2, No such file or directory

有谁能够帮我。谢谢你

4

2 回答 2

3

正如例外所说,您的系统上没有文件/usr/bin/sh。如果您正在寻找 Bourne shell,那就是/bin/sh.

于 2013-05-03T06:32:54.297 回答
-2
public void run() {
        //log.info("taskDao:{},concurrentHashSet:{},id:{},shellName:{},shellDate:{}", taskDao, concurrentHashSet, id, shellName, shellDate);
        log.info("concurrentHashSet:{},param:{}", concurrentHashSet, param);

        int exeState = 99999;
        // ssh跳转到其他机器去执行脚本,you can add "ssh rd@g1-jg-hadoop-01 \"source ~/.bash_profile ; bash -x %s %s\"" instead of command
        String command = "source ~/.bash_profile ; bash -x %s %s";
        String commandF = String.format(command, param.getShellName(), param.getRecallDate());
        String[] cmdArr = {"/bin/sh", "-c", commandF};
        long taskId = param.getTaskId();

        Runtime runtime = Runtime.getRuntime();
        Process process = null;
        try {
            process = runtime.exec(cmdArr);
            InputStream stderr = process.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stderr);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line).append(System.lineSeparator());
            }
            log.info("exe task thread param:{},commandF:{},execute shell info:{}", param, commandF, sb.toString());
            exeState = process.waitFor();

        } catch (InterruptedException | IOException e) {
            log.error("execute shell error,exeState:{},command:{}", exeState, commandF,e);
        } finally {
            log.info("execute shell state:{}", exeState);
            // 从set中删除 更新表状态 多张表一个脚本,会有问题,其中状态覆盖
            if (exeState == 0) {
                // 执行成功
                taskDao.updateStateByPrimaryKey(taskId, (short) 30, new Date());
                // 邮件参数
                param.setState(30);

                String mailBody = SendMailUtil.beautyMailHtmlLayout(param);
                String mailToAddress = param.getMailToUser();
                String mailTitle = param.getMailContentTitle();
                try {
                    SendMailUtil.sendMail(mailToAddress, mailTitle, mailBody);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (exeState != 0) {
                // 执行失败
                taskDao.updateStateByPrimaryKey(taskId, (short) 40, new Date());

                // 邮件参数
                param.setState(40);

                String mailBody = SendMailUtil.beautyMailHtmlLayout(param);
                String mailToAddress = param.getMailToUser();
                try {
                    SendMailUtil.sendMail(mailToAddress, "回溯任务", mailBody);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            ExecuteTaskModel taskModel = new ExecuteTaskModel();
            taskModel.setId(taskId);
            log.info("remove task in thread,id:{}", taskId);
            boolean remove;
            if (concurrentHashSet.contains(taskModel)) {
                remove = concurrentHashSet.remove(taskModel);
            }
            log.info("remove from set success set:{}", concurrentHashSet);
            log.info("execute task thread exit!");
            System.out.println("Process exitValue: " + exeState);
            assert process != null;
            process.destroy();
        }
    }
于 2019-12-03T02:33:18.037 回答