linux shell 編程 11 特殊符號 & 以及和他的恩怨

這篇文章中主要說說這四個符號: &、&& 、$!、$$ 四個符號。java

符號解釋:mysql

&&: 邏輯關係 與sql

& : 在後臺運行進程
shell

$! : 是最後運行的後臺Process的PID編程

$$:是腳本運行的當前進程ID號數組

爲何要在這裏說這些符號那,有三個不是在以前已經學習過了嗎,緣由有1、獲取程序的pidtomcat

下面咱們就看看 這幾個符號:
bash

在以前的文章中獲取pid 的方式就是以下兩種學習

一、若是是使用ps 命令來查看pid 則: ps -ef |  grep -v 'grep' | grep  'java' | awk '{print $2}'
fetch

這個命令就是獲取java 這個程序的pid,由於使用ps 命令第一列輸出的是user  第二列輸出的是 pid 因此就這樣咱們能獲取這個程序的pid

二、若是是按照端口號來查看pid的則: netstat -anp | grep  8080 | awk '{print $7}'  | awk '{split($0,b,"/");print b[1]}'

這個命令就是獲取8080 這個端口號的程序的pid ,由於使用netstat  輸出的列數的第七列有程序名稱和pid 而他們之間是使用「/」 來隔開的,因此使用了 awk 編程命令的split 來獲取數組 在獲取數組中的值,這樣就得到了pid


三、但老是感受這種方式有點不舒服,感受代碼寫的很死,不健壯若是輸出的列有變化則就獲取不到了。因此咱們能夠這種方式來試試,那就是 $! 和 & ,經過上面的介紹咱們也知道,$! 就是最後運行的process的pid 而 & 是表示在後臺執行進程,這樣咱們就能夠使用一個命令來獲取程序的pid了

四、簡單實例,獲取pid

#!/bin/bash
java hello  & echo $! >/usr/src/run.pid

這個腳本很簡單,就是運行hello這個java程序, 以後的應該能猜到了,就是獲取運行 這個java 的進程pid 在將他重定向到run.pid 這個目錄下。

獲取這個文件中pid  : $(cat  /usr/src/run.pid)  或使用反引號 ` cat /usr/src/run.pid`

這樣咱們就能從這個文件中讀取以前保存的pid了,獲取以後咱們能夠使用: ps -p $pid | grep 'name' 來獲取這個程序是否執行的信息。


五、附上正式腳本

#!/bin/bash

basepath=/www/homepage

PATH=$PATH:$HOME/bin:/usr/local/mysql/lib/mysql/

JAVA_HOME=/usr/java/jdk
ANT_HOME=/usr/java/ant
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/usr/local/resin/lib/jsdk23.jar
PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
export JAVA_HOME CLASSPATH ANT_HOME PATH

LANG=zh_CN
export LANG
cd $basepath/WebRoot/WEB-INF/classes
PID=`cat /www/homepage/1minute.pid`
content=`ps -p $PID -f |grep DumpFileByMultThread`
if [ "$content" != "" ]; then
        kill -9 $PID
        echo "$PID is killed"
fi
java -classpath .:$basepath/WebRoot/WEB-INF/lib/commons-httpclient-3.0.jar:$basepath/WebRoot/WEB-INF/lib/log4j-1.2.11.jar:$basepath/WebRoot/WEB-INF/lib/commons-logging-1.0.4.jar:$basepath/WebRoot/WEB-INF/lib/commons-codec-1.3.jar:$basepath/WebRoot/WEB-INF/lib/commons-net-1.4.1.jar:$basepath/WebRoot/WEB-INF/lib/jakarta-oro.jar com.soufun.fetch.DumpFileByMultThread $basepath/src/com/soufun/fetch/1minute.txt & echo $! > /www/homepage/1minute.pid
~

注: 這裏有個問題 &$! > filenae  這個寫在java啓動腳本中沒問題,可是寫在啓動tomcat的腳本中不報錯 可是獲取的那個pid 壓根就找不到對應的進程。

上面腳本中主要的地方分析以下:

(1)、使用反引號`` 或者 $() 來執行命令 cat   /www/homepage/1minute.pdi 從這個文件中獲取pid

(2)、使用  ps -p $pid -f | grem "name"  獲取指定pid下的指定的進程名稱的進程信息。注意這裏不加 -f 的話就獲取不到進程名稱,-f 是全名稱展現

(3)、若是進程存在則能夠獲取相關信息,若是不存在則獲取不到信息,信息爲空

(4)、若是信息不爲空的,說明進程在執行, 使用kill  -9  $pid 強制殺死進程以及子進程


六、 附帶四個符號:

>、>!、>> 、 < 、這四個符號

>               輸出重定向到一個文件或設備 覆蓋原來的文件>!              輸出重定向到一個文件或設備 強制覆蓋原來的文件>>             輸出重定向到一個文件或設備 追加原來的文件<               輸入重定向到一個程序

相關文章
相關標籤/搜索