查了很多資料,大多都說是去修改 /boot/grub/grub.cnf 的設定,但新版的 grub.cnf 事實上是電腦自動產生的,不管怎麼改參數,數值都會被覆蓋掉。
正確解法應該是直接修改 /etc/default/grub:
GRUB_TIMEOUT=10 # wait for 10 secs
修改完畢後記得更新設定:
sudo update-grub2
詳細的解說,可以參考 Grub2 – Ubuntu community wiki 上的說明。
軟體開發、伺服器和生活瑣事
查了很多資料,大多都說是去修改 /boot/grub/grub.cnf 的設定,但新版的 grub.cnf 事實上是電腦自動產生的,不管怎麼改參數,數值都會被覆蓋掉。
正確解法應該是直接修改 /etc/default/grub:
GRUB_TIMEOUT=10 # wait for 10 secs
修改完畢後記得更新設定:
sudo update-grub2
詳細的解說,可以參考 Grub2 – Ubuntu community wiki 上的說明。
一般 grep 只會將出現關鍵字的那一行文字顯示出來,例如:
johnroyer@box:~/logs$ zgrep 'parse' *gz
2016-02-27.log.gz:[2016-02-27 12:00:35] local.INFO: DOMDocument cannot parse XML: Premature end of data in tag html line 2
2016-02-27.log.gz:[2016-02-27 12:00:36] local.INFO: DOMDocument cannot parse XML: Premature end of data in tag html line 2
2016-02-27.log.gz:[2016-02-27 12:01:08] local.INFO: DOMDocument cannot parse XML: Premature end of data in tag html line 2
....
但有時顯示出來的訊息只是 function call stack trace 的其中一行,單看這一行無法理解到底發生了什麼事情。
遇到這種情況時,可以透過參數「-A」和「-B」來設定保留前後文:
johnroyer@box:~/logs$ zgrep 'Exception' *.gz -A 5 -B 2
[2016-05-29 23:41:22] production.INFO: RuntimeException: https://theinitium.com/newsfeed/
[2016-05-29 23:41:22] production.INFO: DOMDocument cannot parse XML: PCDATA invalid Char value 8
[2016-05-29 23:41:23] production.ERROR: exception 'RuntimeException' with message 'Invalid host label, check its content' in /home/segm/prod/www-crawler/vendor/league/url/src/Components/Host.php:164
Stack trace:
#0 /home/segm/prod/www-crawler/vendor/league/url/src/Components/AbstractSegment.php(47): LeagueUrlComponentsHost->validate('rss_Content.jsp')
#1 /home/segm/prod/www-crawler/vendor/league/url/src/Components/AbstractSegment.php(39): LeagueUrlComponentsAbstractSegment->set('rss_Content.jsp')
#2 /home/segm/prod/www-crawler/vendor/league/url/src/Components/Host.php(72): LeagueUrlComponentsAbstractSegment->__construct('rss_Content.jsp')
#3 /home/segm/prod/www-crawler/vendor/league/url/src/AbstractUrl.php(226): LeagueUrlComponentsHost->__construct('rss_Content.jsp')
.....
上面的範例是關鍵字前保留 2 行,往後保留 5 行。
這邊標題應該下的不是很好,其實問題和 gnome-teminal 應該是沒什麼關係的。
在 windows 透過 pietty (快換 putty 吧) 連上 server 時,都是直接用 Ctrl + 左/右 來切換 windows, .screenrc 設定方式如下:
bindkey 33[C next
bindkey 33[D prev
不過當 client 是 Ubuntu 時,在 gnome-terminal 操作時,Ctrl + arraow 卻完全沒有效果。後來友人提示在 screen 底下可以先 ctrl + V,再按下 key binding,screen 會把收到的 key code 顯示出來,方便 debug。嘗試了不少種組合都沒有成功。
當 Google 第一頁搜尋結果無法找到方法時,只好往第二頁找屍體。慢慢看到有人提到需要修改 /etc/inputrc 的設定:
# allow the use of the Home/End keys
"e[1~": beginning-of-line
"e[4~": end-of-line
# allow the use of the Delete/Insert keys
"e[3~": delete-char
"e[2~": quoted-insert
....
# mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving
"e[1;5C": forward-word
"e[1;5D": backward-word
"e[5C": forward-word
"e[5D": backward-word
"ee[C": forward-word
"ee[D": backward-word
設定檔中間可以看到 Ctrl + arrow 已經被轉成 forward-word 等操作,把那幾行註解掉即可。
ps. 除了 ssh client 這邊的 inputrc 需要修改外,server side 若有 inputrc 也需要一起修改,不然 client 送過去的 key binding 還是會被 server 改掉。
爬 log 發現 log 格式不正確,而且還是經常發生,而手動追蹤時又找不到錯誤在哪裡:
find . -name '*2016-01*.log.gz' | xargs -I'{}' -P 4 zgrep keyword {} | awk ...
做了測試以後才發現 xargs -P 時,各個 process 只要有 stdout 就會和其他 process 打架,造成資料還沒寫完就被其他 process 插單,導致最後出來的資料不正確。
先建立二個檔案,儲存不同的二個資料。
0.test.log (每行 50 字):
.................................................
.................................................
.................................................
....
1.test.log (每行 50 字):
1111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111
...
接下來使用 xargs 來 echo 這二個檔案內容:
find . -name '*test.log' | xargs -I'{}' -P 2 cat {} > output.xargs.log
接下來寫個 script 來檢查 output.xargs.log 的內容是否都正確:
for LINE in `cat output.xargs.log `; do
if [ 50 -lt ${#LINE} ]; then
echo $LINE
fi
done
結果會發現 output 有一行超過 50 個自得情況發生:
111111111111111111111111111111111111.................................................
而相同的情況下,parallel 就不會有相同的情況發生:
find . -name '*test.log' | parallel -j 2 cat {} > output.xargs.log
原因是 parallel 會將 jobs (process) 的 output 先 buffer 起來,等到整個 job 都結束以後在一起送到 stdout。若使用上述的範例改用 parallel 的操作來測試的話,可以發現不同 job 的 output 有被完全區隔開來,沒有混在一起:
...
.................................................
.................................................
.................................................
1111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111
...
總之,以後用到 xargs -P 時,要小心 race condition … (暈)
通常我們會用「tail -f FILE」來將檔案新增加的內容顯示在螢幕上,不過要同時顯示多個檔案的新資料就有點麻煩了,會需要改成以下寫法:
tail -f FILE_1 -f FILE_2 ....
所以有人寫了個歡樂的工具叫做「multitail」可以一次監視多個檔案,甚至還會自動幫你切割視窗來顯示不同檔案的內容。
要做到同上的功能,只要這樣寫:
multitail FILE_1 FILE_2
若要觀察的檔案太多,多到分割視窗根本看不到東西時,也可以讓 multitail 不要做切割,全部顯示在一起就好:
multitail --mergeall FILE_1 FILE_2