跳到主要內容

發表文章

Hello World!

即將要搬家,因此舊網頁內容將慢慢轉移至Blogger。 如果要存取舊網頁,可以使用以下連結: https://wiki.tonylin.idv.tw/dokuwiki/doku.php
最近的文章

Rebind所有的SCSI hard drive

Problem 由於USB的Storage有時會比一般SATA的硬碟早被系統載入,而導致USB的Storage為/dev/sda,而其它的則是sdb、sdc等,這造成我們實作某些功能上的困擾。網路上提供的workaroud,像是直接透過uuid指定path;或將要使用項目由sda自動遞增為sdb。這些方法對於做軟體的來說,有著是否能正常取得uuid又或者處理自動遞增複雜度的問題存在。因此我花了一些時間找尋與思考較保險且簡單的解決方法。 註: 由於我們要實作的功能有些限制存在,我無法明講。而這些限制影響了解決方法的自由度,因此我提供的方法僅供需要的人參考。而不同的解法,會隨著支援系統種類需要增加,也許rebind已能解決所有的也不一定。 How to? How to?我認為有幾種可能解法: 別讀取usb_storage module: 不去讀取偵測USB storage的driver不就可以阻止這事情發生嗎? 延遲load usb_storage module: 如果我先偵測了固有的hard drive的driver後,再去偵測USB的部分,不就可以確保USB的storage一定會在後面嗎? reload usb_storage module與hard driver相關的modules: 如果我無法延遲usb_storage載入,那我只要重新再載入去限制順序,不就可以接到第二個方法嗎? Ignore to load 這個方法不適用於你需要其它的USB服務,例如USB CDROM: RHEL5 nousb與nousbstorage參數,此參數在RHEL6與7已被移除。 RHEL6 blacklist參數。 RHEL7 modprobe.blacklist參數。 除了以上方法,從document中得知,應該也可以透過rd.driver.blacklist去指定禁只載入項目,我只試驗過RHEL7是可行的。 Delay load time RHEL6 在RHEL6有driverload參數,讓modprobe前先load你指定的項目。 label linux menu label ^Install Red Hat Enterprise Linux 6 kernel vmlinuz append initrd =initrd.img driverload =ahc

如何由PID去找它所佔用的port?

Problem 之前 曾寫了一篇找尋被佔用Port的方法,觀望網路上大部分找到的教學也都是在講由port找process的方法。但如果今天我想要知道某一個Process到底用了哪些port該怎麼辦? How to resolve? 平常我在check一個process用了哪些port,我會這樣做: 透過ps去找pid。 透過netstat去找所有使用的port。 看這些port占用的pid是誰。 如果不怎麼要求結果要做些什麼整理的,直接用下面的script就可以看到process與port的對應了。 IFS =$ '\n' pid_list = ( ` ps aux | grep "$1" | awk '{print $2}' ` )   for pid in ${pid_list[@]} ; do netstat -nap | grep " $pid " done tcp 0 0 0.0.0.0: 8080 0.0.0.0: * LISTEN 4437 / java tcp 0 0 0.0.0.0: 8443 0.0.0.0: * LISTEN 4437 / java tcp 0 0 127.0.0.1: 32001 0.0.0.0: * LISTEN 4437 / java tcp 0 0 127.0.0.1: 31001 127.0.0.1: 32001 ESTABLISHED 4437 / java tcp 0 0 127.0.0.1: 32002 0.0.0.0: * LISTEN 4508 / java tcp6 0 0 ::: 5111 ::: *

Bypass invalid options of getopts

Problem 我有一隻程式是透過python撰寫,然後透過shellscript去啟動。因為我懶得加功能在python上,所以希望能透過修改shellscript去增加新功能的選項。然而,當我透過getopts去parse輸入參數時,如果少宣告參數在getopts上,程式就會自行停止。本篇文章主要分享pypass的方法。 How to? 預設情況下getopts遇到有問題參數就會停止並顯示無效參數,要避掉這問題解法如下, 在getopts的第一個參數最前面加上:,可以把處理問題流程交給我們自己的腳本。 在?與:處理流程上執行shift,讓parse動作繼續往下。 branch =master test_mode = false while getopts ":b:t" OPT; do case $OPT in b ) branch = " $OPTARG " ;; t ) test_mode = true ;; \? ) shift ;; : ) shift ;; esac done 這樣就可以pypass掉不想處理的項目。 Reference new to Bash - keep getting Illegal option error

ShellScript-字串取代

Problem 一開始的目的是為了取代檔案$FILEPATH中的$target字串為$replace_str,如以下script: cmd = "sed -i 's/ $target / $replace_str /g' $FILEPATH " eval $cmd 但因為$replace_str是一個路徑字串,會包含/(Slash),對sed來說是特殊字元,我們必須在/(Slash)前加一個\(Backslash)。所以我要做的事情就是取代$replace_str中的/為\/。 How to? Method 1 - awk 基本上就是透過gsub這個函式: new_replace_str = ` echo $replace_str | awk '{gsub("/","\\\/",$1);print $1}' ` Method 2 - variable replacement 變數內容取代有兩種寫法: ${變數名稱//舊字串/新字串} 取代所有符合字串 ${變數名稱/舊字串/新字串} 僅取代第一個符合字串 對於處理路徑的問題可以這樣寫: new_replace_str = ${replace_str//\//\\/} ; 後記 sed也可以做到取代檔案內某個字串的效果,可以參考 link 。

ShellScript-Linux AutoLogin

Problem 為了利於測試,先前做過各個不同作業系統的自動登入( link )。隨著測試機逐日增加,為了節省時間與練習shellscript,因此決定寫一個script將設置自動登入的動作給簡單化。但面對不同的Linux,會有不同的自動登入方式,我也很直接的針對不同Distribution使用不同的做法。目前我所支援的作業系統為SLES11、RHEL5、RHEL6、CentOS5、CentOS6。 How to? 確認Linux Distribution 首先我們可以透過/etc/issue去判斷作業系統版本。以下是我收集的資訊: Welcome to SUSE Linux Enterprise Server 10 SP2 Welcome to SUSE Linux Enterprise Server 11 SP2 Red Hat Enterprise Linux Server release 6.0 Red Hat Enterprise Linux Server release 5.6 CentOS release 5.6 CentOS Linux release 6.0 作法是透過grep指令去判斷/etc/issue檔案是否有出現對應的OS Pattern。SLES判斷是否有SUSE;CentOS/RHEL則是判斷開頭字串與主要版本號;其它的顯示不支援。找到對應的Distribution後就呼叫對應的function。這裡設置OS_INFO_FILE變數為$1與將實際操作寫為各個function,主要是為了便於測試,不然系統檔改壞就要DRBL了。 OS_INFO_FILE = $1 if [ "$1" == "" ] ; then OS_INFO_FILE = / etc / issue fi   if grep SUSE $OS_INFO_FILE > / dev / null; then setupAL_SLES elif grep -e "\(CentOS\)\|\(Red Hat\).*5\.*" $OS_INFO_FILE > / dev / null; then setupAL_RHEL5 elif grep -e &quo

How to login to OS automatically?

Windows 前言 Windows要做到自動登入,不同版本Windows其實大同小異。但有一個最重要的是:必須是正版的Windows,否則會跳出盜版之類的訊息。 Method 1 Modify Registry 新增三個Type String的Registry到\KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon中, AutoAdminLogin: 1 DefaultUserName: administrator DefaultPassword: 123456 AutoAdminLogin為開啟自動登入;DefaultUserName為登入帳號;DefaultPassword為登入密碼。 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] "AutoAdminLogon"="1" "DefaultUserName"="Administrator" "DefaultPassword"="123456" Modify Local Security Policy 在Windows2003或2008中,因為安全性的考量,系統會將一些設定disable/enable。為了達到AutoLogin我們必須去關掉某些設定。 首先到Administrative Tools>Local Security Policy中,如果不想常常改密碼,可以將Account Policies>Password Policy中的Minimum password age修改為0。 接著將Local Policies>Security Option中的Interactive logon: Do not require CTRL+ALT+DEL給Enable。在啟動系統後就不會要求你要先輸入CTRL+ALT+DEL才能Login。 Method 2 透過control userpasswords2指令去設定。

量測Process Execution Time

今天遇到要驗證Process的Kernel Mode Time與User Mode Time,詢問Kay之後得知運算方式如下: Kernel Mode Time: stime + cstime (/proc/$pid/stat中的field 15與17) User Mode Time: utime + cutime (/proc/$pid/stat中的field 14與16) 從/proc/$pid/stat中取得的time是以jiffies為單位,將jiffies * CLK_TCK就會得到以秒為單位的時間,而最終希望以100 nanosecond呈現。為了方便我驗證,我寫了一段shellscript去做計算並顯示出來: pid = $1   utime_f = 14 cutime_f = 16 stime_f = 15 cstime_f = 17   utime = ` cat / proc / $pid / stat | cut -d " " -f $utime_f ` cutime = ` cat / proc / $pid / stat | cut -d " " -f $cutime_f ` u_mode_time = ` expr $utime + $cutime `   stime = ` cat / proc / $pid / stat | cut -d " " -f $stime_f ` cstime = ` cat / proc / $pid / stat | cut -d " " -f $cstime_f ` k_mode_time = ` expr $stime + $cstime `   clock = ` getconf CLK_TCK `   ns_100 = 10000000 nsc = ` expr $ns_100 / $clock ` # unit: 100 nanosecond echo User Mode Time ` expr $u_mode_time \ * $nsc ` echo Kernel Mode Time ` expr $