広範な計測ソフトウェアでtar.gz
-archiveを作成するには、次のコードスニペットを使用します。いくつかのデータをいくつかのファイルに収集した後、後で使用するためにアーカイブし圧縮したいと考えています。 シェルからプログラムを起動すると、すべて正常に動作し、すべてのデータが収集され、正しくアーカイブされます。C++プログラムからtar.gz-archiveを作成できない
ただし、組み込みLinuxシステムのシステム起動後にプログラムを自動的に起動する必要があります。 /etc/init.d
のスクリプトで開始された場合、戻り値0
を取得しても、データファイルはアーカイブ/圧縮されません。さらに、tar.gzファイルが作成されますが、空です。 他のすべてが正常に動作しています。
誰でも説明してください、この特別な自動スタートの特別な場合はどうすればいいですか?
int returnValue = -1;
std::string jobString = RESULT_PATH;
jobString += "/";
jobString += lastJobString;
std::string jobFiles = lastJobString + "*.*";
std::string cmd = "tar cvf - ";
cmd += jobFiles;
cmd += " | gzip > ";
cmd += jobString;
cmd += ".tar.gz";
std::cout << "archiving and compressing " << jobFiles << ": " << cmd << std::flush << std::endl;
returnValue = system(cmd.c_str());
std::cout << "archiving and compressing finished. Code: " << returnValue << std::flush << std::endl;
は、私が使用するなどlibarchive
、libtar
、のようなシステムコマンドを発射するほど怠け者ではない、いくつかのlibrariersがあることを知っているが、私は、これは私の場合のために動作しない理由を知っていただきたいと思います。
また、私の忙しい箱にあるtar
のバージョンは、オプションz
をサポートしていません。
時には、スクリプトからプログラムを起動するときに、すべてのパスが設定されているわけではないので、 '/ bin/tar'のように絶対パスを使用する必要があります。あなたの '.tar.gz'ファイルは、'> '演算子を使用しているときに常に作成されます。これは、エラー時に空のファイルを作成します。 stderrをログファイルにリダイレクトして、エラーメッセージを表示することもできます。また、手動でgzipを起動してstdoutをファイルにリダイレクトすることなく、単に 'tar czf archive.tar.gz filenames'を使うこともできます。 –
@Karsten Koopあなたの答えに感謝します。私が言及したように、私は呼び出しから戻り値としてエラーを取得しません。さらに、私のビジーボックスの 'tar'のバージョンにはオプション' z'がありません。 – bushmills
Return 0は、コマンドが実際に実行されたことを意味しません。 システム( "blabla 123 | gzip> out")でも、ちょうど試したときに0が返されます。 – Ming