저는 Linux Mint 20.2(Debian을 통한 우분투의 Mint)를 실행하고 있습니다.
abraunegg의 onedrive 클라이언트에서 다음과 같은 내용을 출력하는 로그 파일이 있습니다(onedrive 클라이언트는 systemd를 통해 지속적으로 실행됩니다).
2022-Jan-16 14:40:14.9203443 Starting a sync with OneDrive
2022-Jan-16 14:40:14.9206537 Syncing changes from OneDrive ...
2022-Jan-16 14:40:16.1507118 Sync with OneDrive is complete
2022-Jan-16 14:40:40.7630634 Retry sync count: 1: Cannot open file `./Untitled Document' in mode `rb' (No such file or directory)
2022-Jan-16 14:40:41.4198398 Moving ./Untitled Document to ./linux_mint_is_great.txt
2022-Jan-16 14:40:41.9391852 Uploading new file ./linux_mint_is_great.txt ... done.
2022-Jan-16 14:40:45.4773655 Uploading new file ./linux_mint_is_great (copy).txt ... done.
2022-Jan-16 14:40:47.8734736 Uploading new file ./linux_mint_is_great (another copy).txt ... done.
2022-Jan-16 14:40:48.1857814 Starting a sync with OneDrive
2022-Jan-16 14:40:48.186048 Syncing changes from OneDrive ...
2022-Jan-16 14:40:49.4558493 Sync with OneDrive is complete
2022-Jan-16 14:40:59.2265195 Deleting item from OneDrive: ./linux_mint_is_great (copy).txt
2022-Jan-16 14:40:59.3837201 Deleting item from OneDrive: ./linux_mint_is_great.txt
2022-Jan-16 14:40:59.5461714 Deleting item from OneDrive: ./linux_mint_is_great (another copy).txt
클라이언트는 일부 로그 이벤트를 시스템 알림에 출력하도록 구성되어 있지만 매우 중요한 이벤트(예: onedrive에 연결할 수 없음)만 출력하며 다른 문제를 알릴 수 있는 옵션은 없습니다(알릴 계획도 없습니다).
모든 이벤트에 대한 내 로그 파일은 다음 위치에 있습니다.home/john/.config/onedrive/john.onedrive.log
내가 원하는 것은 위의 로그 파일에 있는 이벤트(예: "새 파일 업로드 중...", "OneDrive에서 항목 삭제 중...") 및 표시하고 싶은 기타 항목에 대한 알림을 표시하도록 시스템을 구성하는 것입니다. 로그에서 -tail을 실행하세요. 하지만 이것은 절대적으로 모든 것을 보여주며 어떤 이벤트가 일어나고 있는지조차 알 수 없습니다.
그래서:
로그 파일에서 시스템 알림을 실행하는 방법이 있습니까? 파일의 모든 새 줄에 알림을 보내는 것을 좋아하시나요?
이것이 가능하다고 가정하면 "삭제", "업로드" 또는 알림을 시작하려는 다른 항목으로 시작하는 행만 표시하도록 필터링할 수 있습니까?
이 작업을 수행할 수 있는 GUI 도구는 없을 것 같습니다(알림 설정에는 이러한 사용자 정의에 대한 옵션이 표시되지 않습니다)... 하지만 어떤 종류의 셸 스크립트가 로그 파일을 읽고 관련 줄을 시스템 알림 앱에 보낼 수도 있습니다. ? 그렇다면 시작할 때 쉘 스크립트를 실행하거나 systemd를 통해서도 실행할 수 있습니까?
답변1
첫째, GUI 알림의 경우 다음을 사용할 수 있습니다.notify-send
. 이를 실행하는 "표준" 방법은 notify-send <summary> [body]
만료, 긴급도, 카테고리 등을 변경할 수 있다는 것입니다.
이제 특정 로그 파일에 나타나는 모든 새 줄에 대한 알림을 받으려면 다음 명령을 실행할 수 있습니다.
tail -n -0 -f <log file> | while read line; do notify-send "Notification from <log file>" "$line"; done
tail -n -0 -f <log file>
파일에 추가된 모든 새 줄이 표시되고(파일의 시작 부분 무시) 루프는 while
표시되는 각 줄에 대해 GUI 알림을 보냅니다.
특정 줄을 필터링하려면 명령 grep
에 추가하기만 하면 됩니다. tail
예를 들어, "삭제 중", "업로드 중"으로 시작하는 줄을 표시하려는 경우:
tail -n -0 -f <log file> | grep --line-buffered -e ^Deleting -e ^Uploading | while read line; do notify-send "Notification from <log file>" "$line"; done
이 플래그는 패턴이 발생하는 즉시 추가 버퍼링 없이 패턴과 일치하는 행이 출력되도록 --line-buffered
보장합니다 .grep
물론 while
루프 내부에는 $line
콘텐츠(변경 긴급성, 만료 등)에 따라 매개변수를 변경하는 논리를 추가할 수 있습니다.notify-send
고쳐 쓰다
답변을 게시하고 나서야 알았습니다.@ArtemS.Tashkinov댓글에 게시됨스크립트journalctl
github의 것은 파일에서 데이터를 읽는다는 점을 제외하면 내가 제안한 것과 거의 비슷합니다 . 거기에서 더 많은 아이디어를 찾을 수 있습니다.