要將一個背景程式的輸出Redirect到一個檔案去,如果是用以下的方法是沒用的。
# ./program & > log.txt
正確的方式應該是先Redirect後再丟到背景執行,如下:
# ./program > log.txt 2>&1 &
2012年7月26日 星期四
2011年3月5日 星期六
2011年2月19日 星期六
2010年7月14日 星期三
Server Load Balance
HAProxy可以讓我們簡單架設一個Load Balance的機器。Debian架設方法如下:
# apt-get install haproxy
若要啟用,記得修改/etc/default/haproxy的設定檔
# vim /etc/default/haproxy
Enabled=1
接著便是依據實際環境對Load Balance的設定檔(/etc/haproxy/haproxy.cfg)做修改,可參考此網站
最後,啟動Service
# /etc/init.d/haproxy start
# apt-get install haproxy
若要啟用,記得修改/etc/default/haproxy的設定檔
# vim /etc/default/haproxy
Enabled=1
接著便是依據實際環境對Load Balance的設定檔(/etc/haproxy/haproxy.cfg)做修改,可參考此網站
global
maxconn 10000
user haproxy
group haproxy
daemon
nbproc 8
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
option httpclose
maxconn 32768
contimeout 5000
clitimeout 30000
srvtimeout 30000
listen web-server
bind 0.0.0.0:80
balance roundrobin
server w1 192.168.1.1:80 weight 3 check
server w2 192.168.1.2:80 weight 3 check
option httpchk GET /index.html
option redispatch option forwardfor
最後,啟動Service
# /etc/init.d/haproxy start
2010年6月26日 星期六
update-rc.d
寫了一支Daemon程式,除了在/etc/init.d/rc.local上寫入欲執行的指令外,也可以利用[Debian]update-rc.d指令,更新各runlevel下要執行的script。
首先要產生一個init.d script來執行我們要執行的Daemon,我們可以利用/etc/init.d/skeleton來當做修改的範本。
接著便是修改myservice script,部份修改如下:
最後便是利用update-rc.d指令,更新各runlevel服務啟動設定
defaults參數設定服務在runlevel為2,3,4,5啟動,runlevel為0,1,6為停止。若要詳細的設定,請參考man update-rc.d
首先要產生一個init.d script來執行我們要執行的Daemon,我們可以利用/etc/init.d/skeleton來當做修改的範本。
# cp /etc/ init.d/skeleton /etc/init.d/myservice
# chmod a+x /etc/init.d/myservice
接著便是修改myservice script,部份修改如下:
# vim /etc/init.d/myservice
DESC="Daemon的描述"
NAME=Daemon的檔名
DAEMON=Daemon所在絕對路徑
PIDFILE=/var/run$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME最後便是利用update-rc.d指令,更新各runlevel服務啟動設定
# cd /etc/init.d
# update-rc.d myservice defaults
defaults參數設定服務在runlevel為2,3,4,5啟動,runlevel為0,1,6為停止。若要詳細的設定,請參考man update-rc.d
2010年6月20日 星期日
update-alternatives for gcc
update-alternatives提供了程式版本切換管道,以下將教學如何將gcc也加入到此管理系統。
假設系統已安裝gcc-4.1, g++-4.1, gcc-4.3, g++-4.3
顯示所有的版本
設定所要選擇的版本
# update-alternatives --config gcc
假設系統已安裝gcc-4.1, g++-4.1, gcc-4.3, g++-4.3
# update-alternatives --remove-all gcc
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 41 --slave /usr/bin/g++ g++ /usr/bin/g++-4.3 --slave /usr/bin/gcov gcov /usr/bin/g++-4.3
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 41 --slave /usr/bin/g++ g++ /usr/bin/g++-4.1 --slave /usr/bin/gcov gcov /usr/bin/g++-4.1
顯示所有的版本
# update-alternatives --display gcc
設定所要選擇的版本
# update-alternatives --config gcc
2010年5月30日 星期日
vim同時編輯多個檔案
vim也具有同時開啟及編輯多個檔案的能力:
介紹兩種方法:
第一種是同時開啟多個檔案
# vim -p file1 file2
操作指令如下:
:tabe file3 開啟一個新分頁file3檔案
:tabn 編輯下一個檔案
:tabp 編輯前一個檔案
若覺得切換分頁麻煩可以在vimrc設定
nmap<F3>:tabn<ENTER>
nmap <F4>:tabp<ENTER>
如此便可用F3、F4鍵來快速切換分頁
第二種則類似分割視窗的作法
在vim命令模式
:sp file2
畫面便會被分割,切換檔案方式如下:
[ctrl]+w+[↓↑]
介紹兩種方法:
第一種是同時開啟多個檔案
# vim -p file1 file2
操作指令如下:
:tabe file3 開啟一個新分頁file3檔案
:tabn 編輯下一個檔案
:tabp 編輯前一個檔案
若覺得切換分頁麻煩可以在vimrc設定
nmap
nmap
如此便可用F3、F4鍵來快速切換分頁
第二種則類似分割視窗的作法
在vim命令模式
:sp file2
畫面便會被分割,切換檔案方式如下:
[ctrl]+w+[↓↑]
2010年5月27日 星期四
Linux上偵測Memory Leak
Memory leak一不小心就會發生,往往很難去發現。在Linux有開發程式,可以利用Valgrind這套軟體來偵測程式是否有Leak發生。
Valgrind不僅可偵測Memory Leak,也可以偵測Invalid Pointer和使用未初始化的變數。
Debian:
# apt-get install valgrind
使用方法:
# valgrind --tool=memcheck --leak-check=yes 欲執行的程式
詳細說明
Valgrind不僅可偵測Memory Leak,也可以偵測Invalid Pointer和使用未初始化的變數。
Debian:
# apt-get install valgrind
使用方法:
# valgrind --tool=memcheck --leak-check=yes 欲執行的程式
詳細說明
2010年5月15日 星期六
exim4外寄郵件伺服器
在Debian如何透過exim4設定外寄郵件伺服器來寄信(以gmail以及hotmail為例)
# dpkg-reconfigure exim4-config
在smarthost的設定填入對應的值
gmail
smtp.gmail.com::587
hotmail
smtp.live.com
# vim /etc/exim4/passwd.client
gmail
gmail-smtp.1.google.com:帳號@gmail.com:密碼
*.google.com:帳號:密碼
smtp.gmail.com:帳號@gmail.com:密碼
hotmail
smtp.live.com:帳號@hotmail.com:密碼
重新讀取設定
# /etc/init.d/exim4 reload
# dpkg-reconfigure exim4-config
在smarthost的設定填入對應的值
gmail
smtp.gmail.com::587
hotmail
smtp.live.com
# vim /etc/exim4/passwd.client
gmail
gmail-smtp.1.google.com:帳號@gmail.com:密碼
*.google.com:帳號:密碼
smtp.gmail.com:帳號@gmail.com:密碼
hotmail
smtp.live.com:帳號@hotmail.com:密碼
重新讀取設定
# /etc/init.d/exim4 reload
2010年4月8日 星期四
2010年3月7日 星期日
2009年12月17日 星期四
2009年10月27日 星期二
CMake簡單範例
CMake是一個軟體建構工具,可以幫我們產生MakeFile。以下就用簡單的範例來呈現:
我們有三個檔案main.cpp hello.cpp hello.h和三個CMakeLists.txt
分別位於
|-- CMakeLists.txt
|-- lib
| |-- CMakeLists.txt
| |-- hello.cpp
| |-- hello.h
|-- src
|-- CMakeLists.txt
|-- main.cpp
hello.h
hello.cpp
main.cpp
最上層的CMakeLists.txt
PROJECT (HELLO)
# 加入兩個子資料夾(src後面bin的意思是將src的輸出放到bin資料夾)
ADD_SUBDIRECTORY (src bin)
ADD_SUBDIRECTORY (lib)
lib/CMakeLists.txt
# 將hello.cpp編譯成static library
ADD_LIBRARY (HelloLibrary hello.cpp)
src/CMakeLists.txt
INCLUDE_DIRECTORIES (${HELLO_SOURCE_DIR}/lib)
SET (HELLO_SRCS main.cpp)
ADD_EXECUTABLE (HelloCMake HELLO_SRCS)
TARGET_LINK_LIBRARIES (HelloCMake HelloLibrary)
在執行cmake前,我們可以在最上層先建立一個目錄(例如:build),然後到build目錄下執行cmake,如此cmake後產生的資料皆會在build資料夾裡。
# mkdir build
# cd build
# cmake ../
# make
若順利的話,便可在bin找到HelloCMake執行檔,在lib可找到libHelloLibrary.a
我們有三個檔案main.cpp hello.cpp hello.h和三個CMakeLists.txt
分別位於
|-- CMakeLists.txt
|-- lib
| |-- CMakeLists.txt
| |-- hello.cpp
| |-- hello.h
|-- src
|-- CMakeLists.txt
|-- main.cpp
hello.h
void hello();
hello.cpp
#include "hello.h"
#include <iostream>
void hello() {
std::cout << "Hello CMake!" << std::endl;
}
main.cpp
#include "hello.h"
int main() {
hello();
return 0;
}
最上層的CMakeLists.txt
PROJECT (HELLO)
# 加入兩個子資料夾(src後面bin的意思是將src的輸出放到bin資料夾)
ADD_SUBDIRECTORY (src bin)
ADD_SUBDIRECTORY (lib)
lib/CMakeLists.txt
# 將hello.cpp編譯成static library
ADD_LIBRARY (HelloLibrary hello.cpp)
src/CMakeLists.txt
INCLUDE_DIRECTORIES (${HELLO_SOURCE_DIR}/lib)
SET (HELLO_SRCS main.cpp)
ADD_EXECUTABLE (HelloCMake HELLO_SRCS)
TARGET_LINK_LIBRARIES (HelloCMake HelloLibrary)
在執行cmake前,我們可以在最上層先建立一個目錄(例如:build),然後到build目錄下執行cmake,如此cmake後產生的資料皆會在build資料夾裡。
# mkdir build
# cd build
# cmake ../
# make
若順利的話,便可在bin找到HelloCMake執行檔,在lib可找到libHelloLibrary.a
2009年10月24日 星期六
FastCGI
FastCGI是一個網頁伺服器端應用程式介面,CGI有一個很大的缺點就是CGI程式每次執行就會產生一個新的process,當同時很多人上線時,會對伺服器造成很大負擔;而FastCGI程式是常駐型的CGI程式,不會因為Http_Request結束而終止。
在Debian 5安裝Apache2 + FastCGI
# apt-get install apache2 libapache2-mod-fastcgi
# /etc/init.d/apache2 restart
接著用c寫一個helloFCGI的程式來驗証:
編譯時要加上-lfcgi參數
# gcc -lfcgi -o helloFCGI.fcgi helloFCGI.c
將helloFCGI.fcgi放到所設定的FastCGI執行的資料夾內(Debian安裝好的預設資料夾在/usr/lib/cgi-bin),在網頁執行http://localhost/cgi-bin/helloFCGI.fcgi即可看到結果。
在Debian 5安裝Apache2 + FastCGI
# apt-get install apache2 libapache2-mod-fastcgi
# /etc/init.d/apache2 restart
接著用c寫一個helloFCGI的程式來驗証:
#include "fcgi_stdio.h"
#include <stdlib.h>
int main()
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n"
"\r\n"
"<title>Hello FastCGI</title>"
"<h1>Hello FastCGI</h1>"
"Request number %d running on host <i>%s</i>\n",
++count, getenv("SERVER_NAME"));
}
return 0;
}
編譯時要加上-lfcgi參數
# gcc -lfcgi -o helloFCGI.fcgi helloFCGI.c
將helloFCGI.fcgi放到所設定的FastCGI執行的資料夾內(Debian安裝好的預設資料夾在/usr/lib/cgi-bin),在網頁執行http://localhost/cgi-bin/helloFCGI.fcgi即可看到結果。
2009年9月26日 星期六
update-alternatives
Debian提供了update-alternatives的工具,可以用來管理套件的版本。例如:系統有三套Java的套件GIJ、GCJ和Sun Java,如何能自由且快速的切換不同版本。
首先,先看一下java指令的路徑
#which java
/usr/bin/java
# ls -l /usr/bin/java
/usr/bin/java -> /etc/alternatives/java
# ls -l /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/java-gcj/jre/bin/java
我們可以看到java的指令用一個symbolic link連到/etc/alternatives/java,而/etc/alternatives/java又是一個symbolic link連到/usr/lib/jvm/java-gcj/jre/bin/java。
所以update-alternatives就是將/etc/alternatives/java改掉。
# update-alternatives --display java
java - status is auto.
link currently points to /usr/lib/jvm/java-gcj/jre/bin/java
/usr/bin/gij-4.2 - priority 42
slave java.1.gz: /usr/share/man/man1/gij-4.2.1.gz
/usr/lib/jvm/java-gcj/jre/bin/java - priority 1042
/usr/lib/jvm/java-6-sun/jre/bin/java - priority 63
slave java.1.gz: /usr/lib/jvm/java-6-sun-1.6.0.00/jre/man/man1/java.1.gz
Current `best' version is /usr/lib/jvm/java-gcj/jre/bin/java.
可以看到目前系統有gcj和Sun Java,由於status是auto,而gcj的優先權最高,所以可以最下面顯示目前最佳的版本是gcj。若要改變成java-6-sun:
# update-alternatives --config java
即可選擇java-6-sun。
首先,先看一下java指令的路徑
#which java
/usr/bin/java
# ls -l /usr/bin/java
/usr/bin/java -> /etc/alternatives/java
# ls -l /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/java-gcj/jre/bin/java
我們可以看到java的指令用一個symbolic link連到/etc/alternatives/java,而/etc/alternatives/java又是一個symbolic link連到/usr/lib/jvm/java-gcj/jre/bin/java。
所以update-alternatives就是將/etc/alternatives/java改掉。
# update-alternatives --display java
java - status is auto.
link currently points to /usr/lib/jvm/java-gcj/jre/bin/java
/usr/bin/gij-4.2 - priority 42
slave java.1.gz: /usr/share/man/man1/gij-4.2.1.gz
/usr/lib/jvm/java-gcj/jre/bin/java - priority 1042
/usr/lib/jvm/java-6-sun/jre/bin/java - priority 63
slave java.1.gz: /usr/lib/jvm/java-6-sun-1.6.0.00/jre/man/man1/java.1.gz
Current `best' version is /usr/lib/jvm/java-gcj/jre/bin/java.
可以看到目前系統有gcj和Sun Java,由於status是auto,而gcj的優先權最高,所以可以最下面顯示目前最佳的版本是gcj。若要改變成java-6-sun:
# update-alternatives --config java
即可選擇java-6-sun。
2009年9月22日 星期二
ldd
ldd可以用來顯示每個程式所使用到的shared library。ldd其實是一個shell script而不是執行檔。
在linux,我們可以將程式編譯成靜態連結或是動態連結,在這以hello.c來解釋。
用gcc編譯
# gcc hello.c -o hello
則會產生hello的執行檔,而其預設是使用動態連結的方式:
用file指令來檢視其屬性
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
用ldd來檢視共用了哪些shared library
# ldd hello
linux-gate.so.1 => (0xb7f6a000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfd000)
/lib/ld-linux.so.2 (0xb7f6b000)
此外,此檔案的大小為
# ls -l hello
-rwxr-xr-x 1 howard howard 6256 2008-09-30 00:00 hello
上述為程式使用動態連結,我們也可以將程式編譯成靜態連結:
# gcc -static hello.c -o hello
用file來檢視,可以看到顯示為靜態連結
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.8, not stripped
用ldd來檢視,自然沒使用到任何shared library
# ldd hello
not a dynamic executable
再來檢視檔案的大小
# ls -l hello
-rwxr-xr-x 1 howard howard 564881 2008-09-30 00:07 hello
我們可以看到檔案大小為564881 Bytes,相對於之前用動態連結只用了6256 Bytes,足足大上快一百倍。可見使用動態連結能大大節省空間。
在linux,我們可以將程式編譯成靜態連結或是動態連結,在這以hello.c來解釋。
#include <stdio.h>
int main(void) {
printf("Hello world!\n");
return 0;
}
用gcc編譯
# gcc hello.c -o hello
則會產生hello的執行檔,而其預設是使用動態連結的方式:
用file指令來檢視其屬性
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
用ldd來檢視共用了哪些shared library
# ldd hello
linux-gate.so.1 => (0xb7f6a000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfd000)
/lib/ld-linux.so.2 (0xb7f6b000)
此外,此檔案的大小為
# ls -l hello
-rwxr-xr-x 1 howard howard 6256 2008-09-30 00:00 hello
上述為程式使用動態連結,我們也可以將程式編譯成靜態連結:
# gcc -static hello.c -o hello
用file來檢視,可以看到顯示為靜態連結
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.8, not stripped
用ldd來檢視,自然沒使用到任何shared library
# ldd hello
not a dynamic executable
再來檢視檔案的大小
# ls -l hello
-rwxr-xr-x 1 howard howard 564881 2008-09-30 00:07 hello
我們可以看到檔案大小為564881 Bytes,相對於之前用動態連結只用了6256 Bytes,足足大上快一百倍。可見使用動態連結能大大節省空間。
2009年6月5日 星期五
Debian GNU/Linux 5.0
將近要一年沒有碰Linux了,之前用的Debian GNU/Linux 5.0 (Lenny)都從測試版變成穩定版了。一時興起,決定再來重灌一下Debian。但這次不再選擇使用測試版本,雖說測試版本有許多較新的軟體可以使用,但更新頻率實在是太高了,有時正常的系統更新後就感覺變的怪怪的,然後就要花很多時間去搜集資料把問題解決。
在安裝完後,通常我都會先做以下幾步驟:
以下即為安裝後的畫面
在安裝完後,通常我都會先做以下幾步驟:
- 調整系統字型
- 更新顯示卡驅動程式
- 安裝gcin,並且新增嘸蝦米輸入法
- 到GNOME-Look.org找尋想要的桌布與佈景主題
- 調整登入畫面
- 安裝PCMan (主要用來PTT)
- 安裝Audacious (聽音樂必備)
- 安裝aMSN
以下即為安裝後的畫面

訂閱:
文章 (Atom)