【问题标题】:Runtime.getRuntime().exec using PIPE in commandRuntime.getRuntime().exec 在命令中使用 PIPE
【发布时间】:2017-08-20 20:56:06
【问题描述】:

我正在尝试创建一个拆分的 TAR 文件并通过检查目录的大小来读取进度。 (我不能使用 PV 命令)。

谁能解释一下为什么如果在 tarService.java 中我将命令更改为:

String cmd="su -c tar -cp -C /dev . | split -b 1G -a 3 - "+ fname;

MainActivity 中的进程在其他进程完成之前从不记录任何内容,同时:

String cmd="su -c tar -cpf " + fname + " -C /dev .";

有效!

注意在这两种情况下都会创建 tar 文件。

MainActivitiy.java

    public void startBackup(View v){

       back= new BackgroundTask().execute();

    }

    private class BackgroundTask extends AsyncTask<Void, Integer, String> {


        @Override
        protected String doInBackground(Void... arg0) {
            backup = new Intent(MainActivity.this, tarService.class);
            backup.putExtra("fname", "test.tar);    
            status=999;
            startService(backup);
            while (status == 999) {
                        try {
                            Process process = Runtime.getRuntime().exec("du -sk /dev");
                            BufferedReader bufferedReader = new BufferedReader(
                                    new InputStreamReader(process.getInputStream()));
                            String line;
                            while ((line = bufferedReader.readLine()) != null) {
                                Log.d(TAG,line);
                            }
                        }
            }
        }

    }

tarService.java

protected void onHandleIntent(Intent i) {
        try{
            location=i.getStringExtra("location");
            fname=i.getStringExtra("fname");
            // THIS WORKS
            String cmd="su -c tar -cpf " + fname + " -C /dev .";
            Process process = Runtime.getRuntime().exec(cmd);
            int code=process.waitFor();
            Intent intent = new Intent("BackupProcess");
            intent.putExtra("status", code);
            Log.d(TAG,Integer.toString(code));
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
            throw new RuntimeException(e);
        }
 }

已解决

出现代码错误,我也将文件名传递给du 命令,但拆分后文件名不同。

【问题讨论】:

  • 因为 PIPE 使用父命令的输出作为输入;因此,您可以使用 pipe 命令同时获取日志记录详细信息是没有意义的。
  • 在 mainActivity 中运行执行 tar 命令的服务后,我运行另一个进程读取文件夹大小,没有管道,而其他进程正在创建 tar 文件,它向我显示文件夹大小,但是管它没有。我知道管道获取父命令作为输入,但我试图在另一个进程中读取大小,我错了吗?

标签: java linux android-intentservice


【解决方案1】:

exec() 不启动 shell,因此它不理解重定向和管道等 shell 语法。如果您使用 shell 语法,则必须通过 sh -c ... 启动一个 shell。

【讨论】:

  • 每当我提出这个声明时,总会有人反对,但它仍然是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多