顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

2010年12月5日 星期日

core dump 命名設定

往往每一發現core dump產生, 系統預設產生檔名為core.pid, 還得由log去查看是哪支程式的pid, 實在很不直覺化

首先, linux針對code dump的命名設定, 參考於/proc/sys/kernel/core_pattern

$> more /proc/sys/kernel/core_pattern


預設值為"core", 可使用的命名變數如下:
%p : pid
%% : output one %
%u : uid
%g : gid
%s : signal number
%t : time of dump
%h : host name
%e : executable filename
% : % is dropped
% : both are dropped


個人習慣core dump可以得知哪支程式產生, 所以命名式為 "core.%e.%p"
$> echo "core.%e.%p" > /proc/sys/kernel/core_pattern

$> vi /etc/sysctl.conf
kernel.core_pattern = core.%e.%p

以上大功告成!!

2009年4月22日 星期三

How to read .ini file by using glib

在Windows API中, 提供相當方便的函式庫, 可以簡單地讀取.ini檔案,
但在c++ standard library中, 卻不見著任何蹤跡,
雖說自己很喜歡coding, "蛋"不是這麼搞的啦!!

google search提供了一個相當不錯的工具 -- glib

不免俗地要介紹一下本文主角- glib 。

gnome是基於gtk+開發的一套桌面環境,gnome和KDE作為兩大最流行的桌面環境,在全世界廣泛使用。 只要是在Linux下工作的開發人員,對於gtk+一定不陌生。 而對於glib,這個gtk+下的無名英雄,其功能強大卻鮮為人知。

glib不是glibc,儘管兩者都是基於GPL的開源軟體。但這一字之差卻誤之千里,glibc是GNU實現的一套標準C的庫函數,而glib是gtk+的一套函數庫。
在linux平臺上,像其他任何軟體一樣,glib依賴於glibc。glib不是一個學院派的東西,也不是憑空想出來的,完全是在開發gtk+的過程中,慢慢總結和完善的結果。

如果你是一個工作3年以上的C語言程式師,現在讓你講講寫程式的苦惱,你可能有很多話要說,但如果你有時間研究一下glib,你會發現,很多苦惱已不再成其為苦惱,glib裏很多東西正是你期望已經久的。

gobject是glib的精粹,glib是用C實現的,但在很大程式是基於面向物件思想設計的,gobject是所有類的基類。signal在其中也是一大特色,signal與作業系統中的signal並不一樣,它是類似消息一樣的東西,讓消息在各個物件間傳遞,但儘量降低物件間的耦合。

1. setup the glib

$> ./configure
$> make
$> make install
2. include glib header files and library to compile
##顯示glib include的路徑
$> pkg-config --cflags glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include

##顯示glib library的路徑
$> pkg-config --libs glib-2.0
-L/usr/lib -lm -lglib-.20

並在程式的標頭檔加入下列文字
#include "glib.h"

完成上述兩個簡單的步驟, 就可以親身去體會glib的強大之處囉!!

參考來源::
GLib Reference Manual
Wiki GLib

2009年3月22日 星期日

如何在vim支援doxygen彩色語法

若在vim中, 可以支援doxygen的 彩色語法, 一定可以大大增加可讀性
沒想到, 這是真的, 這下子在註解時, 更可以把doxygen發揮到極限

其實步驟非常簡單:
  1. 於home directory下, 建立.vim/after/syntax的目錄
  2. 下載doxygen.zip (v1.15)
  3. 解壓縮上述檔案, 將doxygen.vim & doxygen.txt複製至~/.vim/after/syntax
  4. 針對每一個想到支援doxygen syntax coloring的檔案類型, 建立soft link
$> cd ~/.vim/after/syntax
ln -s doxygen.vim c.vim
ln -s doxygen.vim cpp.vim
ln -s doxygen.vim java.vim

參考來源:
Doxygen syntax coloring in vim

2009年3月13日 星期五

How to format date and time by using C lib

在Linux中, 如何有效快速地格式化時間為字串格式呢??
原來有個系統函式可以簡易地達到這樣的目的,

size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);

s : 存放日期時間轉換為字串格式的buffer
max : 上述s的最大長度
format : 格式化符號
tm : 日期時間結構

example:

int main () {
char msg[256];
time_t now;
struct tm *timestr;

time (&now);
timestr = localtime (&now);
strftime (msg, sizeof(msg),"%Y%m%d%H%M%S", timestr);
printf ("the datetime is %s \n", msg);
}

則會輸出以下字串
the datetime is 20090315093045


出乎意料地簡單吧!!

2009年3月1日 星期日

TCP TIME_WAIT的釋義

在實務中, 許多情況下, 可能是Server Socket出現了問題, 勢必採取關閉原有的Sever Socket, 再隨即重新啟動新建的Server Socket. 但此刻會發生一個問題, 就是相隔時間過短, 在新建的Sever Socket進行bind()的程序時, 系統會出現一錯誤訊息"the address already in use".

照一般想法, Server Socket都已Close, 理應已釋放出該IP Address之資源, 怎會出現這個令人莫名的訊息呢??

關鍵在於TCP建立於多次的握手協定的基礎上, 以達到保證訊息傳遞的完整性.
由於TPC是全雙工傳輸, 換言之, 雙向的傳輸必須單獨進行關閉, 原則上主動請求關閉的一方A, 藉由發送FIN來請求終止這個方向的連接. 被動關閉的一方B, 收到FIN表示A-->B的方向已無資料進行傳送, 此時B-->A仍是可以進行資料傳送, 待B執行被動關閉.
簡言之, A欲進行關閉傳輸時, 必須通知B並確認, 而B欲進行關閉傳輸時, 也必須通知A並確認.



關閉連線:(如上圖所示)

(1) 當處於ESTABLISHED狀態時, TCP B欲主動關閉連線, 發送FIN至TCP A, 進入到FIN-WAIT-1狀態, 等待TCP A回應ACK, 表示等待確認TCP A得知TCP B要關閉連線

(2) 當TCP A收到TCP B的FIN時, 立即回應ACK給TCP B, 進入到CLOSE-WAIT狀態, 表示須等到應用程序沒有任何資料要傳送給TCP B, TCP A才決定關閉連線

(3) TCP B收到TCP A回應的ACK, 表示確認TCP A得知TCP B要關閉連線, 此刻等待TCP A發送FIN

(4) TCP A決定關閉連線, 發送FIN至TCP B, 進入到LAST-ACK狀態, 等待TCP B回應ACK, 表示等待確認TCP B得知TCP A要關閉連線

(5) TCP B收到TCP A的FIN後, 隨即回應ACK, 進入TIME_WAIT狀態, 表示TCP B得知TCP A要關閉連線, 且等待2MSL時間, 以防TCP A再次發送FIN

(6) TCP A收到TCP B回應的ACK後, 進入CLOSED狀態, 表示TCP A已確認TCP B已得知它要關閉連線, 才進行關閉連線

(7) TCP B等待2MSL時間, 才進入CLOSED狀態, 關閉連線, 並自連線表中移除

在上述的第(5),(7)點, 此刻TIME-WAIT的用意在於, 雖TCP B已確認TCP A要關閉連線, 且回應了ACK給TCP A, 但不保證TCP A會收到ACK, 一旦ACK遺漏, TCP A會再次發送FIN給TCP B, 再次進行確認, 所以TCP B須進入TIME-WAIT狀態, 等待2MSL時間, 預防TCP A會再次發送FIN, 進行連線關閉的確認


different states of a TCP connection:
LISTEN : awaiting a connection request from client (監聽客戶端的連線請求)
SYN-SENT : a SYN has been sent to server, and client is awaiting the ACK of SYN (發送SYN, 並等待服務端回應SYN的ACK)
SYN-RECEIVED : a SYN has been received from client, a SYN with ACK has been sent to client, and server is awaiting the ACK of SYN (接收客戶端的SYN, 另傳送SYN+ACK(SYN)給客戶端, 並等待客戶端回應SYN的ACK)
ESTABLISHED : the three-way handshake has been completed, and established the connection (完成握手協定, 並建立連線)
FIN-WAIT-1 : the local AP has issued a close. active TCP has sent a FIN to passive TCP, and is awaiting an ACK of FIN (主動端發出FIN至被動端, 並等待被動端回應FIN的ACK)
FIN-WAIT-2 : a previous FIN has been sent to passiveTCP, and received an ACK of FIN from passive TCP. active TCP is awaiting a FIN from the passive TCP (成功接收到先前傳送至被動端FIN的ACK, 此刻等待被動端傳送FIN)
CLOSE-WAIT : passive TCP has received a FIN from active TCP, and has sent an ACK of FIN to active TCP. passive TCP is awaiting a close request from remote AP before sending a FIN (被動端已接收主動端的FIN, 並傳送FIN的ACK至主動端, 此刻等待AP要求關閉連線)
LAST-ACK : previously a FIN has been received from active TCP, and an ACK of FIN has been sent to active TCP, and a FIN has been sent to active TCP. passive TCP is awaiting an ACK of FIN (先前收到主動端的FIN, 且傳送FIN的ACK給主動端, 另被動端傳送FIN給主動端, 此刻被動端等待主動端回應FIN的ACK)
TIME-WAIT : FINs have been received and ACK has been sent passive TCP. active TCP is waiting 2MSLs to remove the connection from the connection table (收到被動端的FIN, 並傳送ACK至被動端, 此刻主動端會等待2MSL的時間才將連線關閉)
CLOSED : a connection has been removed from the connection table (連線不存在於連線表)

參考資料:
Transmission Control Protocol
TCP State Diagram
TCP Connection Termination
Socket FAQ -- 2.7 please explain the TIME_WAIT state


2008年11月20日 星期四

System Log in Linux (openlog, syslog, closelog)

每當撰寫AP時, Log的工作是絕對馬虎不得, 但各個AP記錄著自己獨立的log file,
當發生問題時, AP彼此之間要對照時間及訊息時, 就是一件很麻煩的工程,
因為一個事件的引發, 其對應的作業流程卻是散佈於一連串的AP之中,
舉例來說:當客戶下訂單時, 訂單模組會建立訂單, 再通知倉儲模組,
若物料不足, 則須通知採購模組,
若物料充足, 則須通知生產製程模組, 以此類推...

有沒有什麼方法, 可以讓所有AP共同將log message記錄於同一個log file??
答案是: 有的!linux提供了syslog的 system call, 讓這類的工作變得非常簡單易用!



                    ( syslog protocol 運作圖)




#include

int main(int argc, char **argv)
{
openlog("ident", LOG_CONS | LOG_PID, LOG_USER);

syslog(LOG_INFO,
"This is a syslog test message generated by program '%s'\n",
argv[0]);

closelog();
return 0;
}

## 連接至system logger
void openlog(const char *ident, int option, int facility);

## 產生log message
void syslog(int priority, const char *format, ...);

## 關閉連接
void closelog(void);

ident : 出現於每個log message, 通常是設為程式名稱
option :
LOG_CONS : 如果送到system logger時發生問題,直接寫入系統console
LOG_NDELAY : 立即開啟連接(通常,連接是在第一次寫入訊息時才打開的)
LOG_PERROR : 將訊息也同時送到stderr
LOG_PID : 將PID含入所有訊息中

facility : (指定程式的類型, 藉由syslog.conf決定不同的作業方式)
LOG_AUTH : 安全/授權訊息(別用這個,請改用LOG_AUTHPRIV)
LOG_AUTHPRIV : 安全/授權訊息
LOG_CRON : 時間守護神專用(cron及at)
LOG_DAEMON : 其它系統守護神
LOG_KERN : 核心訊息
LOG_LOCAL0到LOG_LOCAL7 : 保留
LOG_LPR : line printer次系統
LOG_MAIL : mail次系統
LOG_NEWS : USENET news次系統
LOG_SYSLOG : syslogd內部所產生的訊息
LOG_USER(default) : 一般使用者等級訊息
LOG_UUCP : UUCP次系統

level : (決定訊息的重要性, 以下的等級重要性逐次遞減)
LOG_EMERG : 系統無法使用
LOG_ALERT : 必須要立即採取反應行動
LOG_CRIT : 重要狀況發生
LOG_ERR : 錯誤狀況發生
LOG_WARNING : 警告狀況發生
LOG_NOTICE : 一般狀況,但也是重要狀況
LOG_INFO : 資訊訊息
LOG_DEBUG : 除錯訊息

priority : (facility | level)

2008年10月4日 星期六

RHEL 5 Installation Number

在對岸找到Red Hat Enterprise 5的安裝序號,這是一定要記錄的!

RHEL 5 Install Number
Server:
Red Hat Enterprise Linux (Server including virtualization):
2515dd4e215225dd
Red Hat Enterprise Linux Virtualization Platform:
49af89414d147589
Client:
Red Hat Enterprise Linux Desktop:
660266e267419c67
Red Hat Enterprise Linux Desktop + Workstation Option:
da3122afdb7edd23
Red Hat Enterprise Linux Desktop + Workstation + DualOS Option
(Virtualization):
7fcc43557e9bbc42
Red Hat Enterprise Linux Desktop + DualOS Option (Virtualization):
fed67649ff918c77

Red Hat Enterprise 5 無法使用ftp登入??

剛安裝完Red Hat Enterprise 5,系統並不預設開啟ftp的服務。

##先查詢系統安裝了哪些ftp??
$> chkconfig --list | grep ftp
vsftp : 關閉
gssftp : 關閉
##開啟gssftp的服務
$> chkconfig gssftp on
##以windows登入ftp, 錯出現以下錯誤訊息
530 Must perform authentication before identifying USER.
Login failed.
##修改/etc/xinetd.d/gssftp
$> vi /etc/xinetd.d/gssftp
server_args = -l -a (將-a刪除, 取消認證機制)
即可正常登入ftp服務囉!!

Red Hat Enterprise 5 無法使用telnet登入??

發佈了Red Hat Enterprise 5,故極欲安裝來嚐鮮一下,安裝過程還極順利,沒想到麻煩是在安裝結束過後,自Red Hat 7.x後,都須使用者自行啟動telnet服務,為什麼呢?

因為telnet在登入時,帳號密碼都是以”明文”的方式傳送,如此一來,當被有心人士監聽封包時,資料隨即被竊取,非常不安全的資料傳輸方式,所以官方建議以ssh取代。

1. telnet未被xinetd啟動服務
##查詢telnet的服務啟動狀態
$> chkconfig --list | grep telnet
ekrb5-telnet:關閉
krb5-telnet:關閉
telnet:關閉

##開啟krb5-telnet服務
$> chkconfig krb5-telnet on

$> vi /etc/xinetd.d/krb5-telnet
disable = no (預設值為"yes")

##重新啟動xinetd
$> service xinetd restart
2. 若telnet無法登入,並出現下列錯誤訊息
getnameinfo: localhost: Success
Temporary failure in name resolution: Illegal seek
##允許遠端主機及Static IP Address進行連線
$> vi /etc/hosts
192.168.1.100 pcname
##允許遠端主機及dynamic IP Address進行連線
$> vi /etc/hosts.allow
ALL: Allow
參考資料:
鳥哥--以Openssh取代Telnet連線方式

2008年9月29日 星期一

PostgreSQL--(三)備份與回復

1. 備份
$> pg_dump --format=c --file=test1.out pyarddb
gt; pg_dump --format=c --file=test1.out pyarddb
--format:select format of output file(p:plain-text, t:tar-archive, c:custom-archive)
--file:specify output file
2. 回復
$> pg_restore --dbname=pyarddb pyard.backup
gt; pg_restore --dbname=pyarddb pyard.backup
--dbname: select the database and restore into the database

2008年9月26日 星期五

PostgreSQL--(二)Server配置&建立資料庫

1. 允許本機以外的遠端登入連線
$> vi postgresql.conf
listen_addresses = '*'
2. 遠端登入資料庫的權限控制
$> vi pg_hba.conf
host all all 192.168.x.0/24 trust

3. 建立使用者帳號
$> createuser -s -l -P -e yardmgr
-s:be superuser -l:be allowed to log in -P:specify password -e:echo message
4. 建立資料庫
$> createdb -O yardmgr -e pyarddb
gt; createdb -O yardmgr -e pyarddb
-O:specify user own the new database -e:echo message

2008年9月25日 星期四

PostgreSQL--(一)安裝與設定

1. 下載PostgreSQL, 並且解壓縮至/usr/目錄中
$> mkdir /usr/src/postgresql
$> cp postgresql-8.x.x.tar.gz /usr/src/postgresql
$> tar -zxvf postgresql-8.x.xx.tar.gz
2. 安裝PostgreSQL
$> su - root
$> cd /usr/src/postgresql/postgresql-8.x.xx/
$> ./configure
--prefix: specify installation directory, default is /usr/local/pgsql
--with-pgport: set the port number, default is 5432
--with-pam: build the pam support

$> gmake
$> gmake install
3. 建立postgres帳號, 並建立存放資料庫的目錄
$> adduser postgres
$> mkdir /usr/local/pgsql/data
$> chown postgres /usr/local/pgsql/data
4. 函式庫設定
$> vi /etc/profile
LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH

$> /sbin/ldconfig /usr/local/pgsql/lib
5. 環境變數設定
$> su - postgres
$> vi .bash_profile
PATH=$PATH:/usr/local/pgsql/bin
export PATH
MANPATH=/usr/local/pgsql/man:$MANPATH
export MANPATH
PGDATA=/usr/local/pgsql/data
export PGDATA
6. 資料庫叢集(Database Cluster)初始化
##以postgres帳號登入執行..
$> initdb -D /usr/local/pgsql/data
7. 啟動伺服器
##啟動服務, 並且記錄其訊息輸出及錯誤訊息
$> postgres -D /usr/local/pgsql/data >logfile 2>&1 &

$> pg_ctl start -D /usr/local/pgsql/data -l logfile

##以root身份登入
$> /etc/init.d/postgresql start
8. 查看伺服器有無正常運作
##須設定環境變數PGDATA
$> pg_ctl status

##輸出訊息
pg_ctl: server is running (PID: 3974)
/usr/local/pgsql/bin/postgres "-D" "/usr/local/pgsql/data/"
9. 設定開機時, 自動啟動PostgreSQL服務
#以root權限登入
$> vi /etc/rc.d/rc.local
if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]; then
su postgres -c '/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data -l /usr/local/pgsql/data/serverlog -s'
echo -n 'postgresql server is running...'
fi

cp /usr/src/postgresql/postgresql-8.x.xx/contrib/start-scripts/linux /etc/init.d/postgresql
chkconfig --add postgresql
8. Shared Memory配置
$> sysctl -w kernel.shmmax=134217728
$> sysctl -w kernel.shmall=2097152
9. 關閉伺服器
$> pg_ctl stop

$> kill -INT 'head -1 /usr/local/pgsql/data/postmaster.pid'

##以root身份登入
$> /etc/init.d/postgresql stop
10.解除安裝
##註:不會自動刪除已建立的目錄##
$> cd /usr/src/postgresql/postgresql-8.x.xx/
$> gmake uninstall

2008年9月23日 星期二

如何讓PostgreSQL擁有更好的效能??

下列三個主要方面可以提升 PostgreSQL 的效能::

1.查詢方式的變化
這主要涉及修改查詢方式以獲取更好的性能:
  • 創建索引,包括表達式和部分索引;
  • 使用 COPY 語句代替多個 Insert 語句;
  • 將多個SQL語句組成一個事務以減少提交事務的開銷;
  • 從一個索引中提取多條記錄時使用 CLUSTER;
  • 從一個查詢結果中取出部分記錄時使用 LIMIT;
  • 使用預編譯式查詢(Prepared Query);
  • 使用 ANALYZE 以保持精確的優化統計;
  • 定期使用 VACUUM 或 pg_autovacuum
  • 進行大量資料更改時先刪除索引(然後重建索引)

2.伺服器的配置
配置文件 postgres.conf 中的很多設置都會影響性能,所有參數的列表可見:

管理員指南/資料庫伺服器運行環境/資料庫伺服器運行配置, 有關參數的解釋可見:http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.htmlhttp://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html

3.硬體的選擇
電腦硬體對性能的影響可瀏覽 http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.htmlhttp://www.powerpostgresql.com/PerfList/

PostgreSQL為何一定要做Vacuum呢?

無庸置疑,PostgreSQL的更新性能是一大問題。

PostgreSQL更新處理的弱點
PostgreSQL採用追加型的架構,更新的時候,在數據庫內部刪除行之後再追加新行。刪除掉的行由VACUUM命令作為可以再利用區域回收,然後被再利用。如果頻繁進行更新處理也必須讓VACUUM頻繁運行,不然廢棄區域會不斷增加導致數據表肥大化而致使性能惡化。
VACUUM需要掃瞄數據表的全部數據,所以數據表越大處理時間越長。因此,如果數據表很大而且更新又很頻繁,那麼無論怎麼頻繁運行VACUUM也來不及回收更新處理產生的廢棄區域。
然而問題不僅如此,更新處理不僅僅是針對數據表本身,索引也必須同時更新。PostgreSQL的某個列被更新的話,關聯索引也需要全部更新。因此,擁有大量索引的數據表的更新處理量將會特別大,索引也會越來越肥大化。索引的廢棄區域也因此難於被VACUUM回收再利用,比數據表的問題更加嚴重。

假設有如下一個管理網頁訪問次數的簡單數據表,當某個URL被訪問時cnt增加計數,這是一個頻繁更新的典型案例。
CREATE TABLE t1(
url TEXT PRIMARY KEY,-- 主鍵,自動附加索引
cnt INTEGER
);
cnt更新時,url字段的關聯索引也會被更新。
考慮一下cnt發生變更而url沒有變化的情況,這時url的索引更新是沒有必要的。

使用VACUUM抑制數據表的廢棄領域
更新cnt時,這行 數據被刪除(正確地說是在這個時刻變得不可見),然後追加新的數據行。被刪除的行中放置一個被刪除標誌,以及一個指向新行的指針。再次更新這行數據時,從 舊行的指針很容易找到新行,然後用上邊提到的同樣方式在這裡放置指向新行的指針。這樣反覆更新的話就會形成一個指針鏈,叫做更新鏈(UPDATE chain)。
更新鏈越長檢索和更新花費的時間就越長,直到運行VACUUM才會消除這種影響,這是現在PostgreSQL的問題點。

原文出處:
The ‘MV’ in MVCC (Multiversion Concurrency Control) stands for Multi Version. This means that multiple versions of the same data will be kept any time that data changes. Oracle does this by rolling old data into an "undo log." PostgreSQL doesn't use an undo log; instead it keeps multiple versions of data in the base tables. This means that there is much less overhead when making updates, and you must occasionally remove the old versions. This is one of the things VACUUM does.

The way PostgreSQL manages these multiple versions is by storing some extra information with every row. This information is used to determine what transactions should be able to see the row. If the row is an old version, there is information that tells PostgreSQL where to find the new version of the row. This information is needed to be able to lock rows during an update.

Consider this scenario: a row is inserted into a table that has a couple indexes, and that transaction commits. Several updates happen on that row. Each update will create a new row in all indexes, even if the index key didn't change. And each update will also leave an old version of the row in the base table, one that has been updated to point to the location of the new version of the row that replaces it. All of the old data will stick around until the vacuum is run on that table. In a busy system, it doesn't take very long for all the old data to translate into a lot of wasted space. And it's very difficult to reclaim that space if it grows to an unacceptable level.

What this means to those who want to keep their PostgreSQL database performing well is that proper vacuuming is critical. This is especially true on any tables that see a heavy update (or insert/delete) load, such as a table used to implement some kind of a queue. Such tables should generally be vacuumed frequently if they are small--more frequently than autovacuum normally would provide. For more moderate loads, autovacuum will often do a good job of keeping dead space to a minimum.



2008年8月8日 星期五

好用的網管指令 netstat

某些情況下, 須查詢系統中, 已開啟的Port
這時 netstat 就派上用場了

列出Listen的TCP socket & UDP Socket
檢視 TCP 及 UDP 的 LISTEN 資訊
# netstat -l

檢視 TCP 的 LISTEN 資訊
# netstat -tl

檢視 UDP 的 LISTEN 資訊
# netstat -ul

檢視 TCP 的 LISTEN 資訊且不解析(IP及PORT)
# netstat -tln


列出正在使用某Port的Process PDI

列出指定socket的PID
# fuser 25/tcp 137/udp 138/udp 139/tcp

查詢PID資訊
檢視PID資訊(PID部份請填入上面查詢到的數字)

# ps -ef | grep PID
# ps aux | grep PID

列出PID開啟的檔
# lsof -p PID
列出哪些Processes正在使用這個檔案
# fuser -mv /path/filename
殺掉所有正在使用某個路徑或檔案的Processes
殺掉所有正在使用 /home 的Processes
# fuser -km /home