剛好工作上有這個需求, 就順便找了一下看 jq
指令是否可以簡單的做到這件事…
測試了下面的指令以後, 看起來真的是頗好用, 一行指令就可以把 json
轉成 env
了!
cat example.json| jq -r 'to_entries[] | [.key,.value] | join("=")' > example.env
Just another WordPress site
剛好工作上有這個需求, 就順便找了一下看 jq
指令是否可以簡單的做到這件事…
測試了下面的指令以後, 看起來真的是頗好用, 一行指令就可以把 json
轉成 env
了!
cat example.json| jq -r 'to_entries[] | [.key,.value] | join("=")' > example.env
最近剛好工作上有需要, 需要針對一些網路情況不佳的裝置去做一些實驗; 但問題來了, 要在實務上去真的找到這種裝置其實蠻難的, 這時候Linux 提供了一些很好模擬的方式來對特定的網路界面模擬上述情境…
再做了一些快速的瀏覽以後, 看起來在Linux中主要是透過 tc
這個指令來做 traffic control, 不過社群中有人提供了一個更簡便的方式 wondershaper, 如果OS是ubuntu 的話可以用 sudo apt-get install wondershaper
就可以安裝了.
一些常見的指令範例有:
設定eth1
的download=256kbps, upload=128kbps
sudo wondershaper eth1 256 128
清除 eth1
的流量設定
sudo wondershaper clear eth1
這個情境下, 我們可以模擬網路掉包在不同嚴重程度的情況下的情境; 主要是透過 iptables
來達成, 可以參考以下範例:
設定來源ip為 123.123.123.123
且封包到這台電腦的 local port為 3000
時, 其packet drop的機率為 5%
sudo iptables -I INPUT -s 123.123.123.123 -p tcp --dport 3000 -m statistic --mode random --probability 0.05 -j ACCEPT
最近接了藍芽喇叭以後, 發現ubuntu 內建的system settings 在選擇輸出音訊時有時候會不太正常, 常常聲音會出不來, 或是在先前所選的裝置。
後來查了stackoverflow上的一篇文章後, 發現了一個不錯的工具…. pavucontrol
sudo apt install pavucontrol
pavucontrol
然後執行 pavucontrol
以後就有一個新的音訊控制的UI了 XD
剛好在Hacker News 上看到,記錄一下,也許以後會用得到。
有人分享了一個開源的cpu/電源自動化管理工具(auto-cpufreg),讓Linux的筆電的cpu可以電池模式下降件cpu的負載,而在插電模式下,又可以自動的提高cpu的運算能力。
如果有人有Linux的筆電,剛好也可以試試。
基本上常搭配其它linux指令 (find
, awk
, sed
, grep
…)一起使用,主要是因為一些linux的指令是沒直接支援pipe,所以可以透過xargs
將前面pipe的輸出當成input arguments 給下一個指令使用;
當 xargs
後面沒有接任何的指令時,預設是以 echo
來進行輸出喔
將find的結果,透過xargs
來當作grep
主要要找的對象
find . -name "*.go" -print | xargs grep "src"
-0
flag-0
flag主要是用來讓xargs
來讓可以去處理需要escape的字元,像是空白字元…
-n
flag-n
flag 是用來指定每隔多少個要切割成一個pipe的arguments,也就是目前的pipe經過xargs
以後會產生N/n
個pipe(N
為目前pipe的argument數量)。如果沒有設定的話預設為把所有xargs
當下截取到的內容全部收集到目前這個pipe中。
舉例來說,一個env
檔的內容如下:
FOO=123
BAR=456
LOCAL=127.0.0.1
PORT=3000
如果我們沒加-n
flag時,用下面的指令:
cat env| xargs
則輸出結果會是 (env
檔中的4個環境變數會被當成目前這個pipe的argument)
FOO=123 BAR=456 LOCAL=127.0.0.1 PORT=3000
但如果指令改成是下面這樣時
cat env| xargs -n 2
則輸出結果會是 (env
檔的4個環境變數被切割成每2個是一組argument, 並且丟到下一個pipe中,所以這樣就fanout成2個pipe了)
FOO=123 BAR=456
LOCAL=127.0.0.1 PORT=3000
-I
flag-I
主要是可以用來將截取到的內容,暫存成一個變數名稱,來方便下個指令使用。
以下面的例子來說,會將所有找到的 *.conf
檔案,透過xargs
暫存到變數{}
中,所以接下來的ls -al {}
就可以這樣用…
find /etc/ -name "*.conf" | xargs -I{} ls -al {}
另個例子則是像是備份所有的.conf
檔,則可以透過-I
flag
find /etc/ -name "*.conf" | xargs -I{} cp {} {}.bk
bash
更彈性的用法是,它可以直接當作bash
的輸入arguments;若一樣以前面的env
檔來當例子,透過以下指令我們可以透過一個簡短的bash
來處理其中的第3個($2
)環境變數。
cat env| xargs bash -c 'export $2'
最近聽到DK提到TCP BBR這個名詞時,才知道原來它是一種新的TCP 機制,主要可以提高在網路不穩定下的TCP傳輸品質。
當下聽了覺得蠻神奇的,後來去查了以後才發現,這技術已經發表有幾年了,現在才知道真的有點感到汗顏阿0rz…
TCP BBR 全名為 TCP Bottleneck Bandwidth and Round-trip propagation time
,是Google 在2017年所發現的TCP 擁塞控制演算法,適用於在網路不可靠的環境下,可以有效的提升傳輸效率。
而Google他們那時也宣稱,在他們導入Youtube以後,整個infra的網路傳輸效率平均提升了4%以上。
而相關的演算法原理可以參考這裡,基本上就是控制TCP資料的傳送端,透過演算法來控制更適合的傳輸速率,進而到讓傳輸的資料速率可以到達目前傳送與接收端之間的實際最大值,也因為這樣子,所以在真實不穩定的網路下,它可以更好的讓資料傳輸量不會過大而造成網路擁塞…
目前只要Linux Kernel 的版本大於4.9以上,就可以直接透過更改sysctl
的方式來啟用目前主機上的TCP BBR,詳細的設定如下:
透過以下的設定來確定目前的tcp 擁塞演算法:
sysctl net.ipv4.tcp_available_congestion_control
在還未設定使用bbr
之前,通常應該會顯示cubic
接著加入以下的設定到/etc/sysctl.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
最後執行以下指令來套用bbr的設定
sudo sysctl -p
理論上,這時候再次用下面的指令時,目前的TCP 設定時,應該就會是bbr
sysctl net.ipv4.tcp_available_congestion_control
由於TCP BBR的運作模式是主動地計算目前兩端點之前的傳輸頻寬,然後用最佳的方式去想辦法灌滿這段連線,所以從上面模式看來,要啟用的TCP BBR的機器最好是傳送資料端,這樣每次傳送時就會使用這套演算法來強化傳輸效率了。
當然,如果兩端的機器都可以啟用的話,那就沒這個問題了…
TCP BBR也不是萬能的,它為了提高在網路不穩定的情況下的傳輸效率,但同時也會在一些情況下,表現不如預期;這篇文章描述了一系列的情境來說明,何時套用TCP BBR會得到更好的傳輸效率。
ps
與 top
都是linux 開機即有的基礎指令,最近才發現它們也可以幫我們依照消秏資源的程度來呈現目前使用率最大的程式。
-eo
: 是用來指定輸出目前process 的特定欄位,並且在透過 --sort
(linux)或 -r/-m
(darwin)來進行排序。
linux:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu
darwin:
ps -eo pid,ppid,%mem,%cpu,comm -r | head
linux:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem
darwin:
ps -eo pid,ppid,%mem,%cpu,comm -m | head
top
主要是透過互動式的terminal 介面來呈現目前系統的狀態,但其它也可以透過輸出模式的變更來做到與ps
指定相似的結果。
如果需要更fancy的系統狀態儀表板的話,其實可以另外安裝htop
試試…
linux :
-b
代表不使用互動界面的方式出輸結果。-o
代表用特定欄位排序
top -b -o +%MEM | head -n 10
darwin:
-stats
用來顯示輸出的欄位-o
代表用來排序的欄位-l
用來控制要採樣的次數,1 代表只輸出一次結果。-n
用來控制呈現的前n
筆
top -stats pid,cpu,mem,th,pstate,time,command -o MEM -n 10 -l 1
https://shutdown2110.blogspot.com/2018/07/linux-ps-top-cpu.html
https://www.freebsd.org/cgi/man.cgi?ps(1)
https://unix.stackexchange.com/questions/88613/how-is-it-possible-to-sort-ps-commands-cpu-field
https://superuser.com/questions/538957/print-top-output-only-once-on-mac-os-x
不知道有沒有人跟我一樣,常常有些linux的指令都是用過就忘了,每次有需要debug時,又需要再查一次之前linux是怎麼樣使用 0rz
幾次下來以後,還是乖乖把一些常用的debug指令大概列一下如何使用,這樣之後查會快一些吧XDDDD
dmesg
這個指令主要是用來顯示一些開機後的一些訊息,例如像是一些RAM的資訊、網路資訊、硬體資訊、partition 等等…
NOTE:
這個指令會需要用到 sudo
的權限…
sudo dmesg
sudo dmesg | grep -i Memory
輸出的範例就會像是:
[ 0.208540] kernel: Memory: 61491092K/62810216K available (14339K kernel code, 2536K rwdata, 8848K rodata, 2648K init, 4908K bss, 1319124K reserved, 0K cma-reserved)
sudo dmesg -c
有時候dmesg
會只顯示部分的內容,所以我們想要找的資訊可能會在開機很久後而不會顯示在dmesg
的輸出結果;所以如果要看完整的dmesg內容的話,也可以直接到下面兩個log檔去找: