【发布时间】: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