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
로그를 생성할 수 있는 선택적 단위 목록 가져오기
(기본적으로 일부 특수 그룹의 구성원인 루트 및 사용자에게만 시스템 로그 및 기타 사용자 로그에 대한 액세스 권한이 부여됩니다. 그룹 구성원 systemd-journal
, adm
및 은 wheel
모든 로그 파일을 읽을 수 있습니다.)