shell運行多個腳本,for循環多個端口殺進程

背景知識

獲取進程PID殺進程

pid=`lsof -i:7009 | grep LISTEN | awk '{print $2}'`
kill -9 $pid

在Shell腳本中調用另一個腳本的三種方式:

  • source 指定腳本中的命令在同一個shell中運行。(默認shell中的命令都是創建sub-shell,然後執行。執行完後,返回父shell)
  • fork 就是創建sub-shell運行腳本中的命令,和默認運行方式相同。
  • exec 和source相似,區別就是,運行完畢命令後退出,不會返回父shell
     

shell運行多個腳本 、多個命令

1.每個命令之間用;隔開

說明:各命令的執行給果,不會影響其它命令的執行。換句話說,各個命令都會執行,但不保證每個命令都執行成功。

2.每個命令之間用&&隔開

說明:若前面的命令執行成功,纔會去執行後面的命令。這樣可以保證所有的命令執行完畢後,執行過程都是成功的。

3.每個命令之間用||隔開

說明:||是或的意思,只有前面的命令執行失敗後纔去執行下一條命令,直到執行成功一條命令爲止

4.同時運行多個命令的方式:&符號。

注意:試驗了多次   ; 和  kill -2都沒解決問題,&符號和 ()一起,才解決了同時執行三個不同目錄下多個sh腳本的問題。

參考了這篇文章:https://blog.csdn.net/Scythe666/article/details/85244901


#!/bin/sh
#修改前的腳本
python a.py > logs/a.log
python b.py > logs/b.log
python c.py > logs/c.log

#運行發現只有一個python進程,看日誌發現只有a運行了,b和c都沒跑起來。
#估計因爲shell是順序執行的,a沒執行完,所以不會去執行b和c,查了一下果然。
#修改後


#!/bin/sh
#啓動前先停止所有py進程:
ps -ef | grep python | cut -c 9-15| xargs kill -s 9
#shell也提供了一個同時運行多個命令的方式:&符號
python a.py > logs/a.log & python b.py > logs/b.log & python c.py > logs/c.log

我的疑問:有多個sart .sh腳本,啓動A後,不停的打日誌,就不執行後面的start2.sh了

問題: 有多個sart .sh腳本,啓動A後,不停的打日誌,就不執行後面的start2.sh了,一般在Terminal裏面就按Ctrl+C了。

但是怎麼在shell腳本里面實現這個呢?

百度結果:

做自動化測試, 需要用instruments命令啓動模擬器, 這個命令啓動模擬器後不會自動退出. 需要按Ctrl+C, 並且在退出時, 這個命令會寫數據到指定文件, 我們也需要拿到這些數據. 如何在shell腳本或者其他編程語言中實現在Terminal裏面按Ctrl+C的效果?

作者答覆用了  kill -2

但是,我試驗了kill -2對我 並不起作用啊???

我後面的解決辦法:用了重定向,不想再屏幕上看到輸出結果。然後用了 &符號讓多個shell腳本同時執行。

/dev/null 文件
如果希望執行某個命令,但又不希望在屏幕上顯示輸出結果,那麼可以將輸出重定向到 /dev/null:
舉例 $ command > /dev/null
/dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;如果嘗試從該文件讀取內容,那麼什麼也讀不到。 /dev/null 文件非常有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。

如果希望屏蔽 stdout 和 stderr,可以這樣寫:
$ command > /dev/null 2>&1
注意:0 是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。

 

如何利用shell在終端下輸了ctrl+z,ctrl+c,ctrl+d

通常來說:
ctrl-c 是發送 SIGINT 信號,
ctrl-z 是發送 SIGSTOP信號
ctrl-d 不是發送信號,而是表示一個特殊的二進制值,表示 EOF

具體你可以 stty -a 查看系統設置

你如果想在腳本中實現,舉個例子:

sleep 100 &
pid=$!
kill -SIGSTOP $pid  # 相當於 ctrl-z
kill -SIGCONT $pid  # 相當於 fg
kill -SIGINT $pid   # 相當於 ctrl-c

多個同名的sh腳本怎麼用一個sh腳本執行?

問題背景描述:

比如A目錄下有好幾個子文件
A:/a
A:/b
A:/c
A:/d
每個文件夾都有個同名的down.sh,我想同時運行這個down.sh ,如何弄?

如果一個個進到對應目錄執行也是OK的,但是比較麻煩。就想彙總1個SH來執行多個sh腳本比較省事。

下面這個網友的一行命令非常好,但是我那多個sh腳本里面,有的是相對路徑,有的是絕對路徑,執行會報錯文件不存在之類的(文件不是我寫的,我也懶得去改了)

find . -iname down.sh -exec \{\} \;

參考了另外的答覆,寫了1個sh腳本,測試了下,沒發現啥問題

for 變量 in 父目錄/*                         遍歷父目錄裏面的全部子目錄

#!/bin/bash
for folder in /tools/apps/*
do
# 這裏的-d 參數判斷$folder是否存在,-f 參數判斷 $file 是否存在
if [ -d $folder ] && [ -f $folder/down.sh ]; then
     cd $folder && chmod +x $folder/down.sh &&  $folder/down.sh && echo "$folder ok"
fi
done

 

怎麼用1個shell殺掉多個指定的端口呢

問題描述:目錄裏面部署了多個服務。每個服務的端口是分配的固定的。一個個的殺好麻煩,一個shell自動殺豈不更好

for 變量 in $數組[*]               遍歷數組裏的端口號    

#!/bin/bash
#"down_all.sh"殺掉shell腳本所在目錄裏面指定端口的進程
a=(7002 7003 7004 7005)
for port in ${a[*]}; do
#echo $i
#把命令提取到的進程id賦值給變量id。語法是:反單引號把命令括起來,賦值給變量
id=`lsof -i:$port |grep -i 'LISTEN'| awk '{print $2}'`
kill -9 $id && echo "kill $port success" 
done

怎麼用1個shell查看多個指定端口的狀態呢?

#!/bin/bash
#"p_all.sh" 查看指定端口的狀態
a=(9002 9003 9004 9005 9007 )
for port in ${a[*]}; do
#echo $i
id=`lsof -i:$port |grep -i 'LISTEN'`
echo $id
done

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章