2017-08-20 25 views
0

分割されたTARファイルを作成し、ディレクトリのサイズを確認して進行状況を読み取ろうとしています。 (PVコマンドは使用できません)。Runtime.getRuntime()。execコマンドでPIPEを使用する

tarService.javaに私は、コマンドを変更しない場合は、誰かが私に理由を説明できます:他のプロセスが終了するまでとしながら、何をログMainActivityにおけるプロセス

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

ん:

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コマンドにファイル名を渡しました。あまりにも、しかし、s plitはファイル名が異なります。

+0

PIPEは親コマンドの出力を入力時と同じように使用します。したがって、pipeコマンドを使用してログの詳細を同時に取得することはできません。 –

+0

tarコマンドを実行するサービスを実行した後のmainActivityでは、パイプなしでフォルダのサイズを読み取る別のプロセスを実行しますが、他のプロセスはtarファイルを作成していますが、フォルダのサイズは表示されますが、 。私はパイプが入力として親コマンドを取得知っているが、私は別のプロセスでサイズを読み取ろうとしている、私は間違っている? –

答えて

0

exec()はシェルを開始しないため、リダイレクトやパイプなどのシェル構文は理解できません。シェル構文を使用する場合は、sh -c ...経由でシェルを起動する必要があります。

+0

誰かが私がそれを作るたびにこのステートメントをdownvotingしますが、それは本当のままです。 – EJP

関連する問題