Skip to content

Zeroplex 生活隨筆

軟體開發和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: Linux

多核心主機搭配 GNU parallel

Posted on 2015 年 8 月 3 日2021 年 3 月 12 日 By 日落 在〈多核心主機搭配 GNU parallel〉中尚無留言

假如要將 apache log 中,包含某個 pattern 的記錄找出來,寫起來大概會像這樣子:

cat apache*.log | awk -f log-parser.awk

舊電腦就是放著一個檔案一個檔案慢慢跑,沒什麼問題。若新電腦現在不少都是多核心,看個 parser 慢慢跑,但是剩下的 3 個 CPU core 和 disk 都悠哉沒事做,感覺在浪費時間。

parallel 專門設計來讓 script 可以同時並行運作,使用電腦資源來節省時間的好工具。

假設今天 awk 非常吃 CPU 使用量 (規則較為複雜),處理一個檔案會花上很多 CPU 時間,則可以將 log 中的內容分散給多個 CPU 同時處理:

cat apache*.log | parallel --pipe awk -f log-parser.awk

此時,parallel 偵測到有 4 CPU cores,則會自動將 $FILE 內容分批轉送給 awk 處理 (一行為一個單位),這樣能讓 4 個 CPU 同時跑 awk 解析 log 內容。

不過以一行為一個單位轉送資料給 awk,也會耗掉一些運算資源,可以透過 –block 來要求 parallel 多少資料當作一個單位來轉送資料。以下假設一次送 10MB 的資料給 awk 處理:

cat apache*.log | parallel --pipe --block 10M awk -f log-parser.awk

倘若今天 awk 的要處理的東西並不複雜,可以輕鬆解決掉,上面的寫法反而會讓 CPU 閒閒沒事做,不如就讓一個 awk 負責處理一個檔案,且多個檔案同時進行。此時就可以讓檔案處理的部分轉交給 awk:

parallel --pipe -u --block 10M awk -f log-parser.awk ::: apache*.log

備註:parallel 預設會在所有工作執行結束才輸出結果,若要讓 parallel 即時將結果印出,則可加上參數「-u」。

另外一點要注意的是,parallel 預設會使用所有的 CPU 來處理工作,這在多人共同使用的主機上並不是一件好事,一跑下去大家都不用做事了。所以若在共用環境上請記得加上 -j (jobs) 參數,來限制 parallel 不要用掉所有的系統資源。

Reference:

  • GNU Parallel Tutorial
  • How to write multicore sorting using GNU Parallel
  • Use multiple CPU Cores with your Linux commands — awk, sed, bzip2, grep, wc, etc.
  • Using Multiple CPU Cores With Command Line Tools

Tags:Bash, Linux, 資訊學習

限制 Linux sudoer 可用的指令

Posted on 2014 年 7 月 14 日2021 年 3 月 12 日 By 日落 在〈限制 Linux sudoer 可用的指令〉中尚無留言

若要讓某個開發人員除錯,可以重新啟動特定 service,但不可以 sudo 做其他事情,可以透過修改 /etc/sudoers 達成:

zero  ALL=(ALL)  /usr/sbin/service httpd [start|stop|restart]*

以上設定,zero 僅能使用 sudo service httpd,但是沒辦法 sudo service mysql 以及其他操作。

ps. sudoers 中的指令,必須是絕對路徑

Tags:Linux

免 root 權限修改預設 login shell

Posted on 2014 年 6 月 10 日2021 年 3 月 12 日 By 日落 在〈免 root 權限修改預設 login shell〉中尚無留言

Linux 帳號、密碼,通常都是放在 /etc/passwd:

zero:x:1002:1002:,,,:/home/zero:/bin/bash

該列最後一個欄位值「/bin/bash」便是預設要使用的 shell。

由於 /etc/passwd 的檔案權限,不是 root 沒辦法修改

-rw-r--r--  1 root root    1725 May 10 13:14 passwd

若沒有 root 權限,可以透過 chsh、ypchsh 來修改預設 shell。

$ chsh
Password:
Changing the login shell for johnroyer
Enter the new value, or press ENTER for the default
        Login Shell [/bin/sh]: /bin/bash

若使用者帳號設定不存在 local,則使用 ypchsh 做修改,用法相同。

Tags:Linux, 資訊學習

用 grub 更新開機選單

Posted on 2014 年 1 月 19 日2021 年 3 月 12 日 By 日落 在〈用 grub 更新開機選單〉中尚無留言

安裝第二套作業系統並作多重開機,但把原來的開機程式蓋掉,開機選單一團亂,只好手動改。

Ubuntu 的開機選單設定放在 /boot/grub/grub.cfg,可以先用 update-grub (grub-mkconfig) 掃描現有可以開機的位置,並更新到 grub.cfg 設定檔:

$ sudo update-grub

# or
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

接個編輯 grub.cfg,改成需要的樣子存檔。存檔後還需要寫入 MBR,設定才能生效:

$ sudo grub-install /dev/sda
Tags:Linux

在 grep 搜尋「-」符號

Posted on 2014 年 1 月 15 日2021 年 3 月 12 日 By 日落 在〈在 grep 搜尋「-」符號〉中尚無留言

用 grep 搜尋檔案中出現的文字,通常會這樣寫:

$ grep STR fileToSeatch

不過當要搜尋的字串有特出符號,像是「-」,就會出現錯誤訊息:

$ grep "->getVal()" *
grep: invalid option -- '>'

原因是 grep 將「-」開頭的字串視為命令選項 (command option),去尋找「>get()」這個選項,而這個選項並不存在,所以導致錯誤。

在命令輸入前加上「–」,表示之後的參數都當作一般輸入而非選項 (end of option):

$ grep -- "->getVal()" *

要搜尋的字串,就算沒有空白,也建議用引號括起來。像是「>」、「&」等,沒加上引號會在 bash 解析時就發生錯誤:

$ grep > *  # shoud be: grep ">" *
bash: *: ambiguous redirect
Tags:Bash, Linux

文章分頁

上一頁 1 ... 22 23 24 ... 33 下一頁

其他

關於我  (About me)

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Raspberry Pi Ubuntu Unix Vim Web Windows XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.