如何一個命令停止某個埠的服務程序-Linux
我們先看看這麼做的過程,把處理方式整理一下,然後才能用程式處理:
1 netstat -nlp 檢視佔用埠號的服務
2 找到該埠號的程序
3 找到該程序id
4 kill它
程式可以一點一點來:
1 檢視佔用埠號的服務
[ [email protected] root]# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 23946/
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 12711/
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3936/httpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3910/
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3753/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 3786/
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 827412 23946/ /tmp/mysql.sock
unix 2 [ ACC ] STREAM LISTENING 733272 12711/ ./mysql.sock
(省掉了一些內容)
2 可以用grep篩選一下,看看規律,找到有 :3306 的一行就好
用管道符給grep處理:
[ [email protected] root]# netstat -nlp | grep :3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 23946/
既然取出一行了,那就容易了,再篩選一下,用awk分割取出其中一個
3 讀取出埠號
[
23946/
意思是取第七個欄位,這裡預設應該是用tab字元分割的,已經讀取出來了,但是還得拿到/前面的數字
4 取/前面的數字就可以了,這裡還是可以用awk處理
[ [email protected] root]# netstat -nlp | grep :3306 | awk '{print $7}' | awk -F"/" '{ print $1 }'
23946
意思是用/符號分割,取第一部分
5 然後把這個數字傳給kill就可以
kill命令不能跟在管道符後面繼續處理了,會出錯的
[
kill: usage: kill [-s sigspec | -n signum | -sigspec] [pid | job]... or kill -l [sigspec]
需要用到"`"操作符,它可以執行一個語句,這個可以如此執行:
kill `netstat -nlp | grep :3306 | awk '{print $7}' | awk -F"/" '{ print $1 }'`
好了,任務完成了,之後貼一下awk的介紹,挺使用的
當然,有更加精簡的寫法,這裡只是描述思路的實現