這篇文章中主要說說這四個符號: &、&& 、$!、$$ 四個符號。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 強制殺死進程以及子進程
六、 附帶四個符號:
>、>!、>> 、 < 、這四個符號
> 輸出重定向到一個文件或設備 覆蓋原來的文件>! 輸出重定向到一個文件或設備 強制覆蓋原來的文件>> 輸出重定向到一個文件或設備 追加原來的文件< 輸入重定向到一個程序