在 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
-F, --field= 打印指定字段在日志的所有条目中可以采用的所有可能的数据值。
所以,你可以运行:
journalctl --field _SYSTEMD_UNIT
journalctl
获取可以生成日志的可选单元列表
(默认情况下,只有 root 和属于少数特殊组成员的用户才被授予访问系统日志和其他用户日志的权限。组成员systemd-journal
、adm
、 和wheel
可以读取所有日志文件。)