2010年3月22日 星期一

在javascript中抓取陣列資料

記錄在javascript中如何取得在HTML中的陣列資料
以及如何將之讀取出來


一般來說,我們在javascript裡使用的陣列型態的方法如下
例:

//宣告
var url_arr=new Array('software.sopili.net','dev.sopili.net');
//讀取
for(var i in url_arr){document.write(url_arr[i]+'
');}

那,如果想要像php一樣,array的key值是用字串
例:

$url_arr=Array('software'=>'software.sopili.net','dev'=>'dev.sopili.net');
foreach($url_arr as $key=>$value){
echo $key."
";
//重點是 key,有時候非常的需要key這個值,然後是字串型態
}


這時候要用JSON的格式
例:

//宣告
var url_arr={'software':'software.sopili.net','dev':'dev.sopili.net'};
//讀取
for(var key in url_arr){
//這裡面的key值,就真的是字串了!
document.write(url_arr[key]+'
');
}

接下來,要如何從html裡面讀取陣列的值呢?
假使資料來源如下:

<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />

PHP的用法很簡單,直接使用"education"這個名稱就好
例:

foreach($_POST['education'] as $key=>$value) echo $key.' '.$value;

javascript的麻煩一點,但差不多的用法
例:

var mutli_education = document.form_name.elements["education[]"];
for(i=0;i < mutli_education.length;i++){ alert(mutli_education[i].value);}


參考資料:
1.http://dev.sopili.net/2008/11/javascriptarraykey_6376.html
2.http://roshanbh.com.np/2008/08/handling-array-html-form-elements-javascript-php.html
記錄在javascript中如何取得在HTML中的陣列資料
以及如何將之讀取出來


一般來說,我們在javascript裡使用的陣列型態的方法如下
例:

//宣告
var url_arr=new Array('software.sopili.net','dev.sopili.net');
//讀取
for(var i in url_arr){document.write(url_arr[i]+'
');}

那,如果想要像php一樣,array的key值是用字串
例:

$url_arr=Array('software'=>'software.sopili.net','dev'=>'dev.sopili.net');
foreach($url_arr as $key=>$value){
echo $key."
";
//重點是 key,有時候非常的需要key這個值,然後是字串型態
}


這時候要用JSON的格式
例:

//宣告
var url_arr={'software':'software.sopili.net','dev':'dev.sopili.net'};
//讀取
for(var key in url_arr){
//這裡面的key值,就真的是字串了!
document.write(url_arr[key]+'
');
}

接下來,要如何從html裡面讀取陣列的值呢?
假使資料來源如下:

<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />

PHP的用法很簡單,直接使用"education"這個名稱就好
例:

foreach($_POST['education'] as $key=>$value) echo $key.' '.$value;

javascript的麻煩一點,但差不多的用法
例:

var mutli_education = document.form_name.elements["education[]"];
for(i=0;i < mutli_education.length;i++){ alert(mutli_education[i].value);}


參考資料:
1.http://dev.sopili.net/2008/11/javascriptarraykey_6376.html
2.http://roshanbh.com.np/2008/08/handling-array-html-form-elements-javascript-php.html

2010年3月16日 星期二

使用yum時遇到的錯誤

常會遇見在CentOS下使用yum或rpm指令時,發生錯誤:
錯誤訊息大概都大同小異
例:
rpmdb: Lock table is out of available locker entries
rpmdb: Unknown locker ID: xxxx.....

主要做法如下,更新後即可使用


1. rm /var/lib/rpm/__db.00*
2. rpm --rebuilddb

rebuilddb之後,再重新執行安裝即可。

參考資料來源:http://www.kume.idv.tw/read-254.html
常會遇見在CentOS下使用yum或rpm指令時,發生錯誤:
錯誤訊息大概都大同小異
例:
rpmdb: Lock table is out of available locker entries
rpmdb: Unknown locker ID: xxxx.....

主要做法如下,更新後即可使用


1. rm /var/lib/rpm/__db.00*
2. rpm --rebuilddb

rebuilddb之後,再重新執行安裝即可。

參考資料來源:http://www.kume.idv.tw/read-254.html

2010年3月8日 星期一

刪除特定的process

由於有些程式會當掉,於是用了笨方法,每n小時就重啟
原本是用killall xxxx 來把程式砍掉
但現在有一支程式不能刪...於是找了一些方式來過濾,語法如下



ps aux grep 關鍵字 grep -v grep awk '{print $2}'

但是這樣只會列出PID數字,還無法達成一行刪除,問了同事發現有個 xargs的好東西

所以要刪掉某個程式的所有 Process 的語法如下

ps aux grep 關鍵字 grep -v grep awk '{print $2}' xargs -L1 kill

這樣就會把前面 stdout 出來的 PID 數字,再倒給 kill 去砍囉~

參考資料: 一行刪除程式所有的 Process字串處理工具: Awk

由於有些程式會當掉,於是用了笨方法,每n小時就重啟
原本是用killall xxxx 來把程式砍掉
但現在有一支程式不能刪...於是找了一些方式來過濾,語法如下



ps aux grep 關鍵字 grep -v grep awk '{print $2}'

但是這樣只會列出PID數字,還無法達成一行刪除,問了同事發現有個 xargs的好東西

所以要刪掉某個程式的所有 Process 的語法如下

ps aux grep 關鍵字 grep -v grep awk '{print $2}' xargs -L1 kill

這樣就會把前面 stdout 出來的 PID 數字,再倒給 kill 去砍囉~

參考資料: 一行刪除程式所有的 Process字串處理工具: Awk

2009年6月17日 星期三

rsync 參數設定及範例

rsync 資料同步 的參數設定
此篇文章是從http://support.clara.com.tw/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=66看到的
基本上是man rsync的中譯版本而以,但還是讓我省了一些功夫去看英文的
(沒辦法..要多一道翻譯的功夫實在是有點累人)

◎語法:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsync [OPTION]... [USER@]HOST:SRC DEST

rsync [OPTION]... SRC [SRC]... DEST

rsync [OPTION]... [USER@]HOST::SRC [DEST]

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

◎使用模式:
o 當來源端或目的端的路徑都未包含 : 這個分隔符號時,表示複製本地端的檔案.

o 當目的端路徑包含單個 : 這個分隔符號時,表示複製本地端檔案到遠端機器(透過ssh或rsh).

o 當來源端路徑包含 : 這個分隔符號時,表示複製遠端檔案到本地端.

o 當來源端路徑包含 :: 或 rsync:// 這個符號時,表示從遠端rsync伺服器複製檔案到本地端.

o 當目的端路徑包含 :: 或 rsync:// 這個符號時,表示從本地端複製檔案到rsync伺服器.

o 當來源端路徑包含 :: 和加上--rsh=COMMANS (-e COMMAND)參數,表示使用遠端shell程式
 (remote shell)並透過遠端的rsync伺服器,複製遠端檔案到本地端

o 當目的端路徑抱含 :: 和加上--rsh=COMMAND 參數,表示使用遠端shell程式並透過遠端的rsync伺服器,
 複製本地端檔案到遠端機器

o 列出遠端機器的檔案,跟rsync傳輸相同,只不過把本地端的目的地位置留空.

注意: 在所有狀況下(列出遠端機器檔案除外),來源端及目的端的路徑最少要有一個是本地端路徑.


◎使用方式:
rsync -t *.c foo:src/
傳輸目前路徑下所有符合*.c檔案,到foo這台機器的src資料夾.

rsync -avz foo:src/bar /data/tmp
傳輸foo機器src/bar資料夾下的所有檔案到 /data/tmp 資料夾.
-a 表示archive模式,也就是保持原有的檔案權限.
-z 表示傳輸時壓縮資料.

檔案傳輸來源後加上一個/可以避免再目的資料夾下額外建立出一個資料夾.
你可以把來源有沒有/這個符號結尾,想像成"複製這個資料夾下的內容"和"複製這個資料夾\\\".
如: rsync -av /src/foo /dest 則會在 /dest產生一個foo資料夾;
rsync -av /src/foo/ /dest 則不會


◎安裝方式:
安裝了rsync服務,就可以透過remote shell來比對傳輸機器間的檔案.
預設rsync使用ssh在機器間溝通及傳輸.(可以透過 -e 參數修改)
需要注意的是,來源端和目的端的機器都必須安裝有rsync

rysnc client端:安裝rsync只是為了取得rsync這個執行檔案.
路徑: /usr/ports/net/rsync/


a.設定用來和rsync伺服端連結的密碼檔,內容為密碼.(密碼要和伺服端相同)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,執行時在--password-file 指定即可)

某些rsync伺服器需要進行身分認證,當您與這些伺服器連結時,系統會要求您輸入密碼.
您可以透過設定密碼到 RSYNC_PASSWORD 這個環境變數,來避免此狀況發生.
(這個在FreeBSD上面好像是無效的.)


rsync伺服端:伺服端的機器也要安裝 (路徑:/usr/ports/net/rsync/ ,安裝方式同client端).
a.設定 /usr/local/etc/rsyncd.conf rsyncd 的設定檔:

說明:
[ohaha]: rsync區段的設定名稱
path: 備份資料存放的路徑
auth users: 連結rsync服務的帳號
uid,gid: 採用何種身分進行檔案存取
secerts file: 帳號密碼檔位置
read only: 是否唯讀


b.設定給rsync client端傳輸用的帳號及密碼,並且更改權限為root唯讀(600)
格式: 帳號:密碼 (每行一組,帳號和密碼用:分隔,此例帳號為ohaha密碼為ohahabackup)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,與rysncd.conf中的設定相同即可)

c.修改 /etc/rc.conf 新增 rsyncd_enble="YES" (開機自動執行)

d.啟動 rsyncd 服務


◎參數:
-h , --help 顯示rsync求助資訊.

--version 顯示rsync版本.

-v , --verbose 複雜的輸出訊息.

-q , --quiet 安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.

-I, --ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案.
  可以透過此參數關閉此快速檢查.

--size-only rsync只檢查檔案大小是否改變,不管時間存取點是否改變.
  通常用在mirror,且對方時間不太正確時.

-c, --checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)

-a, --archive archive mode 權限保存模式,相當於 -rlptgoD 參數.
  很快速的保存幾乎所有的權限設定,除了硬式連結(透過-H設定).

-r, --recursive 複製所有下層的資料(遞迴)

-R, --relative 使用相對路徑.
如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案

-R, --no-relative 不使用相對路徑.

-b, --backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
  --backup-dir=DIR 設定備份的資料夾.
  --suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~).

-K, --keep-dirlinks 接收方將連結到資料夾的檔案視為資料夾處理

-l, --links 複製所有的連結

-H, --hard-links 保留硬式連結

-p, --perms 保留檔案權限

-o, --owner 保留檔案擁有者(root only)

-g, --group 保留檔案群組

-D, --devices 保留device資訊(root only)

-t, --times 保留時間點

-n, --dry-run 不實際執行傳送,只顯示將會有的傳輸動作

-S, --sparse 嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.

-W, --whole-file 複製所有的檔案,不額外作檢查.
  --no-whole-file 關閉 --whole-file 參數

-x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)

-B, --block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce

-e --rsh=COMMAND 定義所使用的remote shell

--rsync-path=PATH 定義rsync在遠端機器存放資料的路徑

--existing 只比對更新目的端已經存在的檔案

--ignore-existing 忽略目的端已經存在的檔案(也就是不更新)

--delete 刪除傳送端已經不存在,而目的端存在的檔案

--delete-excluded 除了把傳送端已經不存在,而目的端存在的檔案刪除之外,
  也刪除 --exclude 參數所包含的檔案.

--delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,
  但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除.

--ignore-errors 忽略任何錯誤既使是I/O error 也進行 --delete 刪除動作.

--max-delete=NUM 定義rsync不要刪除超過 NUM 個檔案.

--partial rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.
 在某種狀況下保留那些部分傳送的檔案是令人高興的. 你可以透過 --partial 參數達到這個目的.

--partial-dir=DIR 在 --partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案
 寫入定義的資料夾,而非直接寫入目的端.需要注意的是, 此資料夾不應該被其他使用者可以寫入.(如:/tmp)

--force 當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾,
 即使該資料夾不是空的.

--numeric-ids 不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對.
 若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),
 或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid

--timeout=TIMEOUT 設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束.
 預設為0,也就是沒有定義逾時時間.

-T, --temp-dir=DIR 定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存.
 預設是直接在接收端資料夾直接產生暫存檔案.

--compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.

--link-dest=DIR 與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.

-z, --compress 壓縮模式,當資料在傳送到目的端進行檔案壓縮.

-P -P參數和 --partial --progress 相同.只是為了把參數簡單化.

-C, --cvs-exclude 排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上條件的都會被忽略而不傳送.

--exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不進行傳送

--exclude-from=FILE 和--exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案.
執行時,透過此參數讓rsync讀取.
(; #開頭的行列或空白行會被rsync忽略)

--include=PATTERN 定義rsync不要排除符合pattern樣式的檔案.

--include-from=FILE 和--include參數相同,只不過把要包含的檔案寫到某一檔案.

--files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取.
如: rsync -a --files-from=/tmp/foo /usr remote:/backup

-0 --from0 定義檔案所要讀取的檔案是null字元結尾.

--version 顯示版本訊息.

--daemon 定義rsync以daemon型態執行.

--no-detach 當以daemon型態執行時,不要進行分裂且變成背景程序.

--address=ADDRESS 定義所要連結(bind)的ip位址或是host名稱(daemon限定)

--config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定)
預設值為 /usr/local/etc/rsyncd.conf

--port=PORT 定義rsyncd(daemon)要執行的port(預設為tcp 873)

--blocking-io 使用blocking I/O連結遠端的shell,如rsh , remsh

--no-blocking-io 使用non-blocking連結遠端的shell,如ssh (預設值)

--stats 顯示檔案傳送時的資訊狀態

--progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)

--log-format=FORMAT 定義log的格式(在rsyncd.conf設定)

--password-file=FILE 從檔案讀取與遠端rsync伺服器連結的密碼

--bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)

--write-batch=FILE 把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)

--read-batch=FILE 透過讀取紀錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)

--checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)

-4 --ipv4 使用IPv4協定

-6 --ipv6 使用IPv6協定

◎傳輸實作:
實例:備份 ohaha.ks.edu.tw 的所有網頁內容(/usr/local/www/data/).
rsync 伺服端: backup.mlc.edu.tw
rsync client: ohaha.ks.edu.tw

分別設定好伺服端(bakcup)及client端機器(ohaha)的rsync服務.
在client端(ohaha)透過以下指令,把/usr/local/www/data/的所有資料透過rsync放到伺服端的
/backup/ohaha/data/ 資料夾下.
指令: rsync -rvlHpogDtS --password-file=/usr/local/etc/rsyncd.secrets /usr/local/www/data/ ohaha@backup.mlc.edu.tw::ohaha

說明: rsync 指令
rvlHpogDtS 參數 (部分參數可以用-a取代)
--password-file=/usr/local/etc/rsyncd.secrets 所要讀取的密碼檔位置
/usr/local/www/data/ 要備份的資料來源
ohaha@backup.mlc.edu.tw::ohaha 透過ohaha這個帳號,連結rsync伺服端(backup)的[ohaha]設定值.

◎檔案:
設定檔: /usr/local/etc/rsyncd.conf 或 rsyncd.conf

rsync 資料同步 的參數設定
此篇文章是從http://support.clara.com.tw/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=66看到的
基本上是man rsync的中譯版本而以,但還是讓我省了一些功夫去看英文的
(沒辦法..要多一道翻譯的功夫實在是有點累人)

◎語法:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsync [OPTION]... [USER@]HOST:SRC DEST

rsync [OPTION]... SRC [SRC]... DEST

rsync [OPTION]... [USER@]HOST::SRC [DEST]

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

◎使用模式:
o 當來源端或目的端的路徑都未包含 : 這個分隔符號時,表示複製本地端的檔案.

o 當目的端路徑包含單個 : 這個分隔符號時,表示複製本地端檔案到遠端機器(透過ssh或rsh).

o 當來源端路徑包含 : 這個分隔符號時,表示複製遠端檔案到本地端.

o 當來源端路徑包含 :: 或 rsync:// 這個符號時,表示從遠端rsync伺服器複製檔案到本地端.

o 當目的端路徑包含 :: 或 rsync:// 這個符號時,表示從本地端複製檔案到rsync伺服器.

o 當來源端路徑包含 :: 和加上--rsh=COMMANS (-e COMMAND)參數,表示使用遠端shell程式
 (remote shell)並透過遠端的rsync伺服器,複製遠端檔案到本地端

o 當目的端路徑抱含 :: 和加上--rsh=COMMAND 參數,表示使用遠端shell程式並透過遠端的rsync伺服器,
 複製本地端檔案到遠端機器

o 列出遠端機器的檔案,跟rsync傳輸相同,只不過把本地端的目的地位置留空.

注意: 在所有狀況下(列出遠端機器檔案除外),來源端及目的端的路徑最少要有一個是本地端路徑.


◎使用方式:
rsync -t *.c foo:src/
傳輸目前路徑下所有符合*.c檔案,到foo這台機器的src資料夾.

rsync -avz foo:src/bar /data/tmp
傳輸foo機器src/bar資料夾下的所有檔案到 /data/tmp 資料夾.
-a 表示archive模式,也就是保持原有的檔案權限.
-z 表示傳輸時壓縮資料.

檔案傳輸來源後加上一個/可以避免再目的資料夾下額外建立出一個資料夾.
你可以把來源有沒有/這個符號結尾,想像成"複製這個資料夾下的內容"和"複製這個資料夾\\\".
如: rsync -av /src/foo /dest 則會在 /dest產生一個foo資料夾;
rsync -av /src/foo/ /dest 則不會


◎安裝方式:
安裝了rsync服務,就可以透過remote shell來比對傳輸機器間的檔案.
預設rsync使用ssh在機器間溝通及傳輸.(可以透過 -e 參數修改)
需要注意的是,來源端和目的端的機器都必須安裝有rsync

rysnc client端:安裝rsync只是為了取得rsync這個執行檔案.
路徑: /usr/ports/net/rsync/


a.設定用來和rsync伺服端連結的密碼檔,內容為密碼.(密碼要和伺服端相同)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,執行時在--password-file 指定即可)

某些rsync伺服器需要進行身分認證,當您與這些伺服器連結時,系統會要求您輸入密碼.
您可以透過設定密碼到 RSYNC_PASSWORD 這個環境變數,來避免此狀況發生.
(這個在FreeBSD上面好像是無效的.)


rsync伺服端:伺服端的機器也要安裝 (路徑:/usr/ports/net/rsync/ ,安裝方式同client端).
a.設定 /usr/local/etc/rsyncd.conf rsyncd 的設定檔:

說明:
[ohaha]: rsync區段的設定名稱
path: 備份資料存放的路徑
auth users: 連結rsync服務的帳號
uid,gid: 採用何種身分進行檔案存取
secerts file: 帳號密碼檔位置
read only: 是否唯讀


b.設定給rsync client端傳輸用的帳號及密碼,並且更改權限為root唯讀(600)
格式: 帳號:密碼 (每行一組,帳號和密碼用:分隔,此例帳號為ohaha密碼為ohahabackup)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,與rysncd.conf中的設定相同即可)

c.修改 /etc/rc.conf 新增 rsyncd_enble="YES" (開機自動執行)

d.啟動 rsyncd 服務


◎參數:
-h , --help 顯示rsync求助資訊.

--version 顯示rsync版本.

-v , --verbose 複雜的輸出訊息.

-q , --quiet 安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.

-I, --ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案.
  可以透過此參數關閉此快速檢查.

--size-only rsync只檢查檔案大小是否改變,不管時間存取點是否改變.
  通常用在mirror,且對方時間不太正確時.

-c, --checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)

-a, --archive archive mode 權限保存模式,相當於 -rlptgoD 參數.
  很快速的保存幾乎所有的權限設定,除了硬式連結(透過-H設定).

-r, --recursive 複製所有下層的資料(遞迴)

-R, --relative 使用相對路徑.
如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案

-R, --no-relative 不使用相對路徑.

-b, --backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
  --backup-dir=DIR 設定備份的資料夾.
  --suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~).

-K, --keep-dirlinks 接收方將連結到資料夾的檔案視為資料夾處理

-l, --links 複製所有的連結

-H, --hard-links 保留硬式連結

-p, --perms 保留檔案權限

-o, --owner 保留檔案擁有者(root only)

-g, --group 保留檔案群組

-D, --devices 保留device資訊(root only)

-t, --times 保留時間點

-n, --dry-run 不實際執行傳送,只顯示將會有的傳輸動作

-S, --sparse 嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.

-W, --whole-file 複製所有的檔案,不額外作檢查.
  --no-whole-file 關閉 --whole-file 參數

-x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)

-B, --block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce

-e --rsh=COMMAND 定義所使用的remote shell

--rsync-path=PATH 定義rsync在遠端機器存放資料的路徑

--existing 只比對更新目的端已經存在的檔案

--ignore-existing 忽略目的端已經存在的檔案(也就是不更新)

--delete 刪除傳送端已經不存在,而目的端存在的檔案

--delete-excluded 除了把傳送端已經不存在,而目的端存在的檔案刪除之外,
  也刪除 --exclude 參數所包含的檔案.

--delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,
  但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除.

--ignore-errors 忽略任何錯誤既使是I/O error 也進行 --delete 刪除動作.

--max-delete=NUM 定義rsync不要刪除超過 NUM 個檔案.

--partial rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.
 在某種狀況下保留那些部分傳送的檔案是令人高興的. 你可以透過 --partial 參數達到這個目的.

--partial-dir=DIR 在 --partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案
 寫入定義的資料夾,而非直接寫入目的端.需要注意的是, 此資料夾不應該被其他使用者可以寫入.(如:/tmp)

--force 當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾,
 即使該資料夾不是空的.

--numeric-ids 不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對.
 若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),
 或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid

--timeout=TIMEOUT 設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束.
 預設為0,也就是沒有定義逾時時間.

-T, --temp-dir=DIR 定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存.
 預設是直接在接收端資料夾直接產生暫存檔案.

--compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.

--link-dest=DIR 與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.

-z, --compress 壓縮模式,當資料在傳送到目的端進行檔案壓縮.

-P -P參數和 --partial --progress 相同.只是為了把參數簡單化.

-C, --cvs-exclude 排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上條件的都會被忽略而不傳送.

--exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不進行傳送

--exclude-from=FILE 和--exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案.
執行時,透過此參數讓rsync讀取.
(; #開頭的行列或空白行會被rsync忽略)

--include=PATTERN 定義rsync不要排除符合pattern樣式的檔案.

--include-from=FILE 和--include參數相同,只不過把要包含的檔案寫到某一檔案.

--files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取.
如: rsync -a --files-from=/tmp/foo /usr remote:/backup

-0 --from0 定義檔案所要讀取的檔案是null字元結尾.

--version 顯示版本訊息.

--daemon 定義rsync以daemon型態執行.

--no-detach 當以daemon型態執行時,不要進行分裂且變成背景程序.

--address=ADDRESS 定義所要連結(bind)的ip位址或是host名稱(daemon限定)

--config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定)
預設值為 /usr/local/etc/rsyncd.conf

--port=PORT 定義rsyncd(daemon)要執行的port(預設為tcp 873)

--blocking-io 使用blocking I/O連結遠端的shell,如rsh , remsh

--no-blocking-io 使用non-blocking連結遠端的shell,如ssh (預設值)

--stats 顯示檔案傳送時的資訊狀態

--progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)

--log-format=FORMAT 定義log的格式(在rsyncd.conf設定)

--password-file=FILE 從檔案讀取與遠端rsync伺服器連結的密碼

--bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)

--write-batch=FILE 把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)

--read-batch=FILE 透過讀取紀錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)

--checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)

-4 --ipv4 使用IPv4協定

-6 --ipv6 使用IPv6協定

◎傳輸實作:
實例:備份 ohaha.ks.edu.tw 的所有網頁內容(/usr/local/www/data/).
rsync 伺服端: backup.mlc.edu.tw
rsync client: ohaha.ks.edu.tw

分別設定好伺服端(bakcup)及client端機器(ohaha)的rsync服務.
在client端(ohaha)透過以下指令,把/usr/local/www/data/的所有資料透過rsync放到伺服端的
/backup/ohaha/data/ 資料夾下.
指令: rsync -rvlHpogDtS --password-file=/usr/local/etc/rsyncd.secrets /usr/local/www/data/ ohaha@backup.mlc.edu.tw::ohaha

說明: rsync 指令
rvlHpogDtS 參數 (部分參數可以用-a取代)
--password-file=/usr/local/etc/rsyncd.secrets 所要讀取的密碼檔位置
/usr/local/www/data/ 要備份的資料來源
ohaha@backup.mlc.edu.tw::ohaha 透過ohaha這個帳號,連結rsync伺服端(backup)的[ohaha]設定值.

◎檔案:
設定檔: /usr/local/etc/rsyncd.conf 或 rsyncd.conf

2009年5月20日 星期三

linux安裝程式的指令(apt-get、yum)

早期是用rpm
但後來fc,suse,centos,ubuntu都有發展出內建的一套介面程式
目前我有用過的就這幾套
大致上是
yum -->fc,centos,suse
yast -->suse
apt-get -->ubuntu(debian)
(當然..你想在ubuntu上使用yum或是centos上使用apt-get也是可以啦,自己裝一裝就是了)

安裝指令
yum install 套件名稱
apt-get install 套件名稱

搜尋指令
yum provides 關鍵字
apt-cache search 關鍵字


基本上..大概就這二個比較常用,其他像update,remove等參數都是同樣的用法

但在fc6上,我有遇到一個問題..就是用yum install 會無法安裝
它會顯示找不到檔案(那是因為fc6以後,它預設的更新站台己轉移)
要解決這個問題,需要去修改/etc/yum.repos.d/這個目錄下的幾個.repo檔
例如:fedora-core.repo這個檔案
修改原本的
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/$releasever/$basearch/os/

改成
baseurl=http://archives.fedoraproject.org/pub/archive/fedora/linux/core/$releasever/$basearch/os/


fc6的/etc/yum.repos.d/這個目錄下...預設有

fedora-core.repo fedora-legacy.repo
fedora-development.repo fedora-updates.repo
fedora-extras-development.repo fedora-updates-testing.repo
fedora-extras.repo

這幾個檔...原則上每個都要參照原本的路徑去修正
不然就會遇到類似
Error: Cannot find a valid baseurl for repo: extras
這樣的錯誤訊息 ----> 看最後是什麼關鍵字..就去改 fedora-xxxx.repo

這裡要說的是,suse預設是沒有這東西的,即使裝好yum,它的/etc/yum.repos.d/下仍然是空的
得自己新增一個abc.repo的檔案在該目錄下,如下範例

[base]
name=SUSE LINUX 10.0 - Base
#baseurl=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/suse
mirrorlist=/etc/yum.repos.d/base.mirrors
enabled=1
gpgcheck=1
gpgkey=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/pubring.gpg

相關的詳細資料,請參閱http://liquidat.wordpress.com/2005/10/16/setting-up-yum-on-suse-linux-100-3/


最後摘錄一些從 yum apt 常用指令索引看來的資料

APT 常用指令如下:

apt-get update
更新套件列表

apt-get dist-upgrade
升級 rpm

apt-cache search
搜尋套件,ex: apt-cache search httpd

apt-get install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: apt-get install httpd

apt-get remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: apt-get remove httpd

apt-get clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/apt/archives

YUM 常用指令如下:

yum update
更新套件, ex: yum update httpd,如果只有 yum update ,會更新所有已經安裝的套件。

yum search
搜尋套件,ex: yum search httpd*,會搜尋所有跟 httpd 有關的套件。

yum install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: yum install httpd

yum remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: yum remove httpd

yum clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/yum,因為這裡可以清除的項目很多,我最常用的是 yum clean all ,一次給他清掉 :p

yum list
列出套件名稱,用法常用有分以下幾種:

yum list updates
列出所有可以更新的套件

yum list installed
列出所有已安裝的套件

更多的中文參考資訊,可以見以下兩個網站:
YUM的使用
APT 的安裝、使用
早期是用rpm
但後來fc,suse,centos,ubuntu都有發展出內建的一套介面程式
目前我有用過的就這幾套
大致上是
yum -->fc,centos,suse
yast -->suse
apt-get -->ubuntu(debian)
(當然..你想在ubuntu上使用yum或是centos上使用apt-get也是可以啦,自己裝一裝就是了)

安裝指令
yum install 套件名稱
apt-get install 套件名稱

搜尋指令
yum provides 關鍵字
apt-cache search 關鍵字


基本上..大概就這二個比較常用,其他像update,remove等參數都是同樣的用法

但在fc6上,我有遇到一個問題..就是用yum install 會無法安裝
它會顯示找不到檔案(那是因為fc6以後,它預設的更新站台己轉移)
要解決這個問題,需要去修改/etc/yum.repos.d/這個目錄下的幾個.repo檔
例如:fedora-core.repo這個檔案
修改原本的
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/$releasever/$basearch/os/

改成
baseurl=http://archives.fedoraproject.org/pub/archive/fedora/linux/core/$releasever/$basearch/os/


fc6的/etc/yum.repos.d/這個目錄下...預設有

fedora-core.repo fedora-legacy.repo
fedora-development.repo fedora-updates.repo
fedora-extras-development.repo fedora-updates-testing.repo
fedora-extras.repo

這幾個檔...原則上每個都要參照原本的路徑去修正
不然就會遇到類似
Error: Cannot find a valid baseurl for repo: extras
這樣的錯誤訊息 ----> 看最後是什麼關鍵字..就去改 fedora-xxxx.repo

這裡要說的是,suse預設是沒有這東西的,即使裝好yum,它的/etc/yum.repos.d/下仍然是空的
得自己新增一個abc.repo的檔案在該目錄下,如下範例

[base]
name=SUSE LINUX 10.0 - Base
#baseurl=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/suse
mirrorlist=/etc/yum.repos.d/base.mirrors
enabled=1
gpgcheck=1
gpgkey=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/pubring.gpg

相關的詳細資料,請參閱http://liquidat.wordpress.com/2005/10/16/setting-up-yum-on-suse-linux-100-3/


最後摘錄一些從 yum apt 常用指令索引看來的資料

APT 常用指令如下:

apt-get update
更新套件列表

apt-get dist-upgrade
升級 rpm

apt-cache search
搜尋套件,ex: apt-cache search httpd

apt-get install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: apt-get install httpd

apt-get remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: apt-get remove httpd

apt-get clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/apt/archives

YUM 常用指令如下:

yum update
更新套件, ex: yum update httpd,如果只有 yum update ,會更新所有已經安裝的套件。

yum search
搜尋套件,ex: yum search httpd*,會搜尋所有跟 httpd 有關的套件。

yum install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: yum install httpd

yum remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: yum remove httpd

yum clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/yum,因為這裡可以清除的項目很多,我最常用的是 yum clean all ,一次給他清掉 :p

yum list
列出套件名稱,用法常用有分以下幾種:

yum list updates
列出所有可以更新的套件

yum list installed
列出所有已安裝的套件

更多的中文參考資訊,可以見以下兩個網站:
YUM的使用
APT 的安裝、使用

apache 的 rewrite

本篇文章節錄自Apache 重寫規則的常見應用 (rewrite)

主要記錄一下怎麼針對 *.host.com 去做 rewrite的動作


若今天要轉換www.username.domain.com的請求
到www.domain.com/username

對HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on
rewritecond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
rewriterule ^(.+) %{HTTP_HOST}$1 [C]
rewriterule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這裡的 $1 $2 基本上就是對應前面的 ( ) 內的東西
例:$1 = username , $2 = /anypath

注:
rewritecond 條件重寫規則,當滿足上面定義的條件才會應用下面的重寫規則,
rewritecond 另有各種變量,請查閱相關文檔。

另外,可以開啟rewrite的log記錄來看一下是不是轉到莫名其妙的地方去了
可以查看:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html#rewriteloglevel
或直接加入下面二行

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3


注意:
RewriteLogLevel指令設置重寫引擎日誌的詳細程度的級別。 默認級別0意味著不記錄,而9或更大的值意味著記錄所有的操作。

要關閉重寫引擎日誌,可以簡單地設此值為0,關閉所有的重寫操作記錄。

使用較高的Level值會使Apache服務器速度急劇下降! 重寫日誌使用大於2的Level值只用於調試!

本篇文章節錄自Apache 重寫規則的常見應用 (rewrite)

主要記錄一下怎麼針對 *.host.com 去做 rewrite的動作


若今天要轉換www.username.domain.com的請求
到www.domain.com/username

對HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on
rewritecond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
rewriterule ^(.+) %{HTTP_HOST}$1 [C]
rewriterule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這裡的 $1 $2 基本上就是對應前面的 ( ) 內的東西
例:$1 = username , $2 = /anypath

注:
rewritecond 條件重寫規則,當滿足上面定義的條件才會應用下面的重寫規則,
rewritecond 另有各種變量,請查閱相關文檔。

另外,可以開啟rewrite的log記錄來看一下是不是轉到莫名其妙的地方去了
可以查看:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html#rewriteloglevel
或直接加入下面二行

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3


注意:
RewriteLogLevel指令設置重寫引擎日誌的詳細程度的級別。 默認級別0意味著不記錄,而9或更大的值意味著記錄所有的操作。

要關閉重寫引擎日誌,可以簡單地設此值為0,關閉所有的重寫操作記錄。

使用較高的Level值會使Apache服務器速度急劇下降! 重寫日誌使用大於2的Level值只用於調試!

2009年5月18日 星期一

新增swap的大小

主機因故把swap都吃光了...
但又無法有效釋放....只好手動幫它增swap了
下述內容是從 2.2. 增加 Swap 空間 摘錄,若需要詳細內容
請自行前往
http://www.aliok.net/study/linux/rhl-cg-zh_TW-9/index.html
這邊閱讀

由於主機上己無空閒的磁區可供分割出新的swap分割區
於是就利用新增swap檔案的方式來增加swap空間

新增一個 swap 檔案:

請先決定新 swap 檔案的大小,然後乘以 1024 以取得磁碟區塊(block)的大小,例如 64MB 之 swap 檔案的區塊大小為 65536。

請以 root 身份在 shell 提示符號下輸入下列指令,並包括 count 等於區塊大小的數值:

dd if=/dev/zero of=/swapfile bs=1024 count=65536


並使用以下指令來設定 swap 檔案:

mkswap /swapfile


如要立即啟用 swap 檔案(非開機時自動啟動),請使用下列指令:

swapon /swapfile


如要在開機時啟動它,請編輯 /etc/fstab 以包含:

/swapfile swap swap defaults 0 0


下次系統開機時,它將會啟用新的 swap 檔案。

在增加新的 swap 檔案並啟用它後,請檢視 cat /proc/swaps 或 free 指令的輸出以確定它已經被啟用。

主機因故把swap都吃光了...
但又無法有效釋放....只好手動幫它增swap了
下述內容是從 2.2. 增加 Swap 空間 摘錄,若需要詳細內容
請自行前往
http://www.aliok.net/study/linux/rhl-cg-zh_TW-9/index.html
這邊閱讀

由於主機上己無空閒的磁區可供分割出新的swap分割區
於是就利用新增swap檔案的方式來增加swap空間

新增一個 swap 檔案:

請先決定新 swap 檔案的大小,然後乘以 1024 以取得磁碟區塊(block)的大小,例如 64MB 之 swap 檔案的區塊大小為 65536。

請以 root 身份在 shell 提示符號下輸入下列指令,並包括 count 等於區塊大小的數值:

dd if=/dev/zero of=/swapfile bs=1024 count=65536


並使用以下指令來設定 swap 檔案:

mkswap /swapfile


如要立即啟用 swap 檔案(非開機時自動啟動),請使用下列指令:

swapon /swapfile


如要在開機時啟動它,請編輯 /etc/fstab 以包含:

/swapfile swap swap defaults 0 0


下次系統開機時,它將會啟用新的 swap 檔案。

在增加新的 swap 檔案並啟用它後,請檢視 cat /proc/swaps 或 free 指令的輸出以確定它已經被啟用。