lock in bash shell

從來沒想過 bash shell 也有完整的 lock 機制可以用!

之前都是 test -f and touch 測試一個檔案是否存在作為 lock,但是 test 這個操作不確定是不是 atomic ,雖然沒遇過,但難保有兩個 shell 同時 test -f 成功然後兩個 shell 同時操作某個檔案

http://jdimpson.livejournal.com/5685.html 

http://rstudio-pubs-static.s3.amazonaws.com/11711_43c83d91d2324651b0827c10987f757f.html

http://linux.die.net/man/1/flock

「Since kernel 2.0, flock() is implemented as a system call in its own right rather than being emulated in the GNU C library as a call to fcntl(2).」

簡言之就是 kernel2.0 之後支援 flock 這個 system call

然後 bash shell 就有個 flock 包裝了 system call 版本的 flock 出來給 shell 使用

$ which flock
/usr/bin/flock

 

下面有兩個檔案作為範例

$ cat test1.sh
#!/bin/bash
set -e

lockfile="/dev/shm/test"
timeout="5"
exec 8>$lockfile

flock -w $timeout -x 8
for i in {1..10}
do
echo building $(basename $0) $i
sleep 1
done
$ cat test2.sh
#!/bin/bash
set -e

lockfile="/dev/shm/test"
timeout="5"
exec 8>$lockfile

flock -w $timeout -x 8
for i in {1..10}
do
echo building $(basename $0) $i
sleep 1
done

test1 會先執行,然後 test2 卡在 flock 那邊,五秒之後timeout, timeout 會 exit 1,非正常離開,所以在有 set -e 的情況之下, test2 就離開了

$ ./test1.sh & ./test2.sh
[3] 27551
building test1.sh 1
building test1.sh 2
building test1.sh 3
building test1.sh 4
building test1.sh 5
[1] 07/11 23:19:31 owen_wen@desktop:~$ building test1.sh 6 # 這裡 timeout 離開了 test2.sh ,我的 prompt 會印出 return code 1
building test1.sh 7
building test1.sh 8
building test1.sh 9
building test1.sh 10

Qualcomm chipcode web spider

Qualcomm chipcode web spider

In order to fetch chipcode from QCT automatically, I use Firebug to monitor the Header sent to chipcode when login and fetch git info

something matter below

you can simply analysis http://chipcode.qti.qualcomm.com/ to get login URI and param

wget --save-cookies cookies.txt --server-response --post-data 'SMENC=ISO-8859-1&SMLOCALE=US-EN&USER=XXX%40XXX.XXX&PASSWORD=XXXXXXX&target=HTTPS%3A%2F%2Fchipcode.qti.qualcomm.com%2F&smagentname=-SM-SLUS8QqcnzRRGvPvY33l1s3xpnEDhOnjsY6tAWAu2LAkp3RKERaMNP67RRT%2B2TSe' https://chipcode.qti.qualcomm.com/siteminderagent/forms/login.fcc

It’s very important to add “–server-response", since chipcode server will response session info in HEADERS, and you will need the session info to sent GET request

you will get a file named “login.fcc" and you can find all product you can access to

besides login.fcc, you should get a lot of stdout including HEADERS

Copy the value of last Set-Cookie from those HEADERS

use wget with –header to set SMSESSION you copied above

wget --header='cookie:tour_viewed_dashboard_projects=true; SMSESSION=BLtgPXCgOV1l+nFGsdRHjvWP9vPN0OXyq1d7nToGgInH/UuUvPlM7/qB07ijzeq2t2Ul/BBLtoy6q+OuQcFHEn57RB+mPERUonp0aRAHqm4PgmJg1SFn65dKK97YJ61E637X75VdOkR5VB2E933xsA+XCcjYfOpBLgaU9+7ToVyV4G9iyimoLAie1UuhEg40Ow7jLqvbAYaFrXtagsA7Gf1biOF5wb6hQ9esIC5FlxUjOWS83MnrYt29fQb5+zhLD3as3PXDmA8upo+PrNYadPh1drmeo/1t1tRtJGPlKOkVVUxNYq2h8PFUK4H1ddeeB6Ic1qHlKqIvmw4tmVgqQ6Ls85SxUKPVUHtlR9J2NY3ojC3wVZHOiHke4Hdmb0n0oxjWyaGbtaf5OFraJUvOKjJORxMXo+cdBimmucs8mEW10GZIsvJ6EKd7Hq/AfICekdQU7ImCHp7Ba5+aDbLiUtPKoNYgGPk3V4lqn32aLIZ+j8MKEMM1gzOHRy8foLDGQ80SLEvMKUxxRbsZsvyWut5vDXxmapt+3Bp0tvDxcilhZSKRVhzI87uA3XlxyJA8wGoX1FQFYPp1rmpU/RX7bxE0DOYQwX0znZ1NLFGvRQmrLt6tYfswfbg9f8N880bHuhJTFDqJMfx1gAO7+b+q9zGwHR20CwM2wodpjH9BEPTDsYCRP/k8EPzAmPTAO1N6Oo8bpDk1E19sM6GGca/qsSt3PhHiv2B+5klXBu8p7a2G/dcvETviCFBE6TKJOL8LB2K2jZ/HoCfrshXGAsao0Iin0J3X/tv67p65cIzBF3KAE0XR5gc+N11t3WGLfFHT4mW+cnPoh36fNtJSo37e+b4UyFlG4MpMVgacOccroSwz84vP8VlvPIQp+beZAVN4wUeQAHIg0hThhZcij/NPCL4b6mGeRAFnTmBK5ktXeXfv596rbeJ8V3x+IvtWga8wwShI5AX/2eiFGeMYmqgYZCX50e9USfiKtqSr/lXHSs8tWOWlRKd7GYsNrEHUGMxYOEalIcRpFrVAV1vcBa9u9q1wnWNeUWVyVMrTA3fs8c3CeNv/s2t7Q5lbAXjleUo7zVCUmEII2ZHU2i7R0PXzlLxTSlR+qMkI1TkV96DMKdyPkQlvgVfGcMnK1teMth+OGtGX65To0EfV/95kJBEG/+fLNSOcqPTG0BfEqW87pDuyHP3mmPpoD1RdvDb3Gz5EGYk7kYlWRWNtDa5hI8heH/MY77v3+EOySQ0rPwkJQ9vdetIbFy2ngirrvbQOSNYFlYY4Ogwup/Bx7ARfB5e5FeqH0FI5SL30; _gitlab_session=2e8eaad8b31de7355bcd2ebe1674b825; request_method=GET' https://chipcode.qti.qualcomm.com/dashboard/projects_by_product?product=APQ8026.LW.2.0

then you will get a json format string, all product info there

: )

change php exec shell to bash

當我們用 php 的 exec 指令,想要叫電腦執行某些指令或者 shell script 時候

可能會遇到問題

因為 exce 使用 /bin/sh 作為執行的環境,而 linux 有可能使用 /bin/sh -> /bin/dash 當作 /bin/sh 來使用

而 dash 沒有 source 這種 shell command,bash 才有。

這是第一個問題

第二個問題:當我rm /bin/sh;sudo ln -s /bin/bash /bin/sh

看起來應該可以讓我的 php 的 exec() 使用 bash 作為執行環境了

但是為什麼動作的結果和我自己在登入電腦之後在 bash 環境下執行的結果不一樣?

例如 source .bashrc ,顯示 file not found

在 sh 的情況下是因為在 PATH 裡面搜尋不到檔案的話, sh 不會到當前目錄再進行搜尋

但是 bash 在 PATH 裡面搜尋不到檔案的話, bash 是會到當前目錄進行搜尋的

BUT,當我把 /bin/sh -> /bin/bash 之後,用 exec 呼叫,他似乎不是這樣運作…what the fuxx …

解法:

exec("/bin/bash -c"source .bashrc" ");

這樣,我解決了我的問題。但我依然不知道 exec 執行的時候用 bash 跟我帳號登入機器執行 bash 為什麼會不一樣!

製作ftp index[1] shell script + lftp

之前嘗試利用 php 來搜尋 FTP 站台上面的檔案
因為站台檔案太多
要列出所有檔案的時候會吃掉超過三百M的記憶體
所以想改用其他方式來獲得站台上面的檔案資料

由於 lftp 指令在輸入密碼的時候是互動式的交談
所以我用 pipe 的方式輸入帳號密碼
先 vim 一個文字檔案內容類似下面這樣

open xxx.xxx.xxx.xxx
user ID passwd
set net:reconnect-interval-base 10
set net:max-retries 2
set net:timeout 5
set ftp:charset "big5"
set file:charset "utf-8"
find ./
bye

兩次重新連線中間間隔為十秒
最大重試次數兩次
連線逾時時間為五秒
所以如果有連線逾時的話,那麼你會在 console 上面看到五秒倒數畫面,為什麼倒數畫面不是十秒呢?
因為是連線開始之後開始算『重新連線中間間隔時間』,所以逾時之後還要五秒才會重新連線

輸入

  • cat command | lftp > ftp.txt

把command的內容餵給lftp,並且將結果存到ftp.txt

這樣子就可以將站台上面的所有檔案通通製作成 index 放到 ftp.txt 裡面來搜尋了
要開啟更多站台的話只要在 command 裡面多寫幾個 open 就可以了

記得使用 lftp 這隻程式,ftp 沒有 ls -R 這個指令可以用(好像吧 :p)
如果沒有 lftp 這隻程式的話就安裝一下吧!

    Debian可以這樣安裝

  • sudo apt-get install lftp

如果 server 上面的檔案名稱是 big5 編碼的話,你可以輸入下面這行設定到 ~/.lftprc,或者進入 lftp 之後在輸入也可以。

  • set ftp:charset “gbk"; set file:charset “utf-8″

編碼問題參考網頁