ログファイルをリアルタイムで監視し、ログに特定の文が表示されたときに特定のコマンドを実行したいと思います。
私はこのサイト(そして他の多くのサイト)を検索し、次は私が試したことです:
tail -f /var/log/omxlog | awk '/player_new/ { "echo hello" }'
または
stdbuf -o0 tail -F /var/log/omxlog | awk '/player_new/ { "echo hello" }'
しかし、彼らは動作しません。このコマンドを実行するたびに待機が開始されますが、ログファイルが変更されたことは確かですが、echo helloは印刷されません。実際には何もしません。待っています:D
だから私は何をすべきか! ?
(システム:Raspberry Pi。オペレーティングシステム:Raspbian)
答え1
Archemarは、答えの正確な問題に対する正しい解決策を提供します。
しかし、明らかに「echo hello」を使用しているので、bashのように通常のコマンドを実行したいと思います。
この場合、bashにとどまると(awkで行う方法を学ぶことなく)bashの全機能を使用できます。これがより柔軟で作業しやすいことがわかります。
bashメソッド、1行:
tail .... | while read ; do [[ "{REPLY}" =~ player_new ]] && echo hello ; done
次のことができます。
#!/bin/bash
tail_log()
{
tail -f "${1}"
# or use stdbuf here instead
}
do_player_new()
{
local log_line="${1}"
echo "hello"
}
do_something_else()
{
local log_line="${1}"
echo "example: line was ${1}"
}
process_match()
{
local full_line="${1}"
case "${BASH_REMATCH[1]}" #this bash_rematch array holds the part of the line that matched the () in the pattern
in
player_new) do_player_new "${full_line}";;
something_else) do_something_else "${full_line}";;
another_example) do_another_example "${full_line}";;
esac
#or you could actually just execute this:
# "do_${BASH_REMATCH[1]}" "${full_line}"
}
process_log()
{
local logfile="${1}"
local matcher="${2}"
tail_log "${logfile}" | while read line
do
# this checks the line against the regular expression
# and the result of the match (parts between ()) will
# be stored in the BASH_REMATCH array
[[ "${line}" =~ ${matcher} ]] && process_match "${line}"
done
}
process_log /var/log/omxlog '(player_new|something_else)' &
process_log /some/other/log '(another_example)' &
私のAndroid携帯電話でテストを実行するためのテキスト例
$> while sleep 5 ; do echo player_new >> test.txt ; done &
[2] 3110
$> tail -f test.txt | while read ; do [[ "${REPLY}" =~ player_new ]] && echo $(date) hello; done
Wed Feb 15 01:39:12 ACDT 2017 hello
Wed Feb 15 01:39:12 ACDT 2017 hello
Wed Feb 15 01:39:12 ACDT 2017 hello
Wed Feb 15 01:39:15 ACDT 2017 hello
Wed Feb 15 01:39:20 ACDT 2017 hello
^C
$>
この機能は私の携帯電話で動作するので、うまくいかない理由はRaspberry Piと関連があるかもしれません。申し訳ありません。