-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjctl.sh
executable file
·112 lines (102 loc) · 3.79 KB
/
jctl.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/bin/bash
Help()
{
echo "Usage: s76-journalctl.sh <time> [options]"
echo ""
echo "options:"
echo "-b <boot> Get journalctl for specified boot."
echo "-o <filename> Specify output filename."
echo "-h Display this message and exit."
}
BOOT=""
FILENAME="journalctl.log"
SEEN=0
while getopts ":hb:o:" option; do
case $option in
h) # help text
Help
exit;;
b) # Serial Num
BOOT=" -b $OPTARG";;
o) # filename
FILENAME=$OPTARG;;
*) # Invalid option
echo "Error: Invalid option" 1>&2
Help 1>&2
exit 1;;
esac
done
# Temporary file to store new lines.
temp_output=$(mktemp)
temp_journal=$(mktemp)
# Fetch the entire journal since the given timestamp.
sudo journalctl${BOOT} > "$temp_journal"
grep -Ef PATTERNS "$temp_journal" | grep -vEf IGNORE_PATTERNS > "$temp_output"
# Update SINCE to now, so the next iteration will pick up logs from this moment onward.
# Process the new lines.
while IFS= read -r line; do
if [ -f "$FILENAME" ]; then
SEEN=$(grep -c "$line" "$FILENAME")
fi
if [ $SEEN -gt 0 ]; then
continue
fi
timestamp=$(echo "$line" | awk '{print $1, $2, $3}')
if [[ $line == *"[ cut here ]"* ]]; then
block=$(awk -v start_pat="${timestamp}.*\\[ cut here \\]" \
-v stop_pat="${timestamp}.*\\[ end trace [0-9a-fA-F]+ \\]" \
'BEGIN{flag=0} $0 ~ start_pat{flag=1} flag && $0 ~ stop_pat{print; flag=0; exit} flag' "$temp_journal")
if [[ -n $block ]]; then
echo "$block" >> "$FILENAME"
else
echo "$line" >> "$FILENAME"
fi
elif [[ $line == *"invoked oom-killer"* ]]; then
block=$(awk -v start_pat="${timestamp}.*invoked oom-killer" \
-v stop_pat="${timestamp}.*Out of memory" \
'BEGIN{flag=0} $0 ~ start_pat{flag=1} flag && $0 ~ stop_pat{print; flag=0; exit} flag' "$temp_journal")
if [[ -n $block ]]; then
echo "$block" >> "$FILENAME"
else
echo "$line" >> "$FILENAME"
fi
elif [[ $line == *"Oops:"* ]]; then
block=$(awk -v start_pat="${timestamp}.*Oops:" \
-v stop_pat="${timestamp}.*</TASK>" \
'BEGIN{flag=0} $0 ~ start_pat{flag=1} flag && $0 ~ stop_pat{print; flag=0; exit} flag' "$temp_journal")
if [[ -n $block ]]; then
echo "$block" >> "$FILENAME"
else
echo "$line" >> "$FILENAME"
fi
elif [[ $line == *"Modules linked in:"* ]]; then
block=$(awk -v start_pat="${timestamp}.*Modules linked in:" \
-v stop_pat="${timestamp}.*</TASK>" \
'BEGIN{flag=0} $0 ~ start_pat{flag=1} flag && $0 ~ stop_pat{print; flag=0; exit} flag' "$temp_journal")
if [[ -n $block ]]; then
echo "$block" >> "$FILENAME"
else
echo "$line" >> "$FILENAME"
fi
elif [[ $line == *"segfault"* ]]; then
block=$(awk -v start_pat="${timestamp}.*segfault" \
-v stop_pat="${timestamp}.*Code:" \
'BEGIN{flag=0} $0 ~ start_pat{flag=1} flag && $0 ~ stop_pat{print; flag=0; exit} flag' "$temp_journal")
if [[ -n $block ]]; then
echo "$block" >> "$FILENAME"
else
echo "$line" >> "$FILENAME"
fi
elif [[ $line == *"GPU reset begin"* ]]; then
block=$(awk -v start_pat="${timestamp}.*GPU reset begin" \
-v stop_pat="${timestamp}.*amdgpu: soft reset" \
'BEGIN{flag=0} $0 ~ start_pat{flag=1} flag && $0 ~ stop_pat{print; flag=0; exit} flag' "$temp_journal")
if [[ -n $block ]]; then
echo "$block" >> "$FILENAME"
else
echo "$line" >> "$FILENAME"
fi
else
echo "$line" >> "$FILENAME"
fi
done < "$temp_output"