
CentOS 7サーバーでログを生成できるオプションのデバイスのリストを取得したいですjournalctl
。これを達成するために、次のコードをどのように変更できますか?
journalctl --output=json-pretty | grep -f UNIT | sort -u
CentOS 7端末では、上記のコードはgrep: UNIT: No such file or directory
。
編集する:
次のJavaプログラムは、必要なgrepの出力を印刷せずに終了します。ターミナルバージョンに加えてJavaプログラムを動作させるにはどうすればよいですか?
String s;
Process p;
String[] cmd = {"journalctl --output=json-pretty ","grep UNIT ","sort -u"};
try {
p = Runtime.getRuntime().exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((s = br.readLine()) != null)
System.out.println("line: " + s);
p.waitFor();
System.out.println ("exit: " + p.exitValue()+", "+p.getErrorStream());
BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((s = br2.readLine()) != null)
System.out.println("error line: " + s);
p.waitFor();
p.destroy();
} catch (Exception e) {}
答え1
journalctl
すべてのデバイスのログが表示されることがあります。そのデバイスがログに書き込まれるかどうかは別の問題です。
利用可能なすべてのユニットと利用可能なすべてのユニットを一覧表示しますjournalctl
。
systemctl list-unit-files --all
Javaコードの場合、パイプを機能させるにはRuntime.exec()
コマンドをスクリプトに入れてスクリプトを呼び出すか、文字列配列を使用できます。たとえば、次のようになります。
String[] cmd = {"sh", "-c", "command1 | command2 | command3"};
p = Runtime.getRuntime().exec(cmd);
または:
Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});
答え2
man journalctl
説明する:
-F、--field=指定されたフィールドがログ内のすべてのエントリで利用可能なすべての可能なデータ値を印刷します。
したがって、以下を実行できます。
journalctl --field _SYSTEMD_UNIT
journalctl
ログを生成できるオプションの単位のリストを取得する
(デフォルトでは、一部の特殊グループのメンバーであるrootおよびユーザーのみがシステムログおよび他のユーザーログにアクセスできます。グループメンバー、およびsystemd-journal
はadm
すべてwheel
のログファイルを読み取ることができます。)