作者 主題: 如何中斷執行不停的shell script??  (閱讀 15184 次)

0 會員 與 1 訪客 正在閱讀本文。

蒼邪

  • 憂鬱的高中生
  • ***
  • 文章數: 199
    • 檢視個人資料
如何中斷執行不停的shell script??
« 於: 2006-09-12 18:32 »
小弟想要一些系統訊息,所以寫了如下的shell script
代碼: [選擇]

 #!/bin/bash
for(( i=1;i<=5;i=i+1 ))
do
top -b >> /tmp/top.txt
sleep 5
kill -9 `ps aux | grep top | grep -v grep | awk '{print $2}'`
done


以為這樣就能連續執行五次,然後一次delay五秒,再kill掉行程,重新執行

但卡在top -b這一行,我想這一行是一直執行不會停止的,所以shell script也不會繼續執行下一行……

想請問各位先進,如果一直卡在其中一行一直執行,有辦法在shell script中加什麼讓它停止嗎?因為想要每五秒的統計,所以不知道要怎麼做比較好??
*萬般帶不走,唯有業隨身**

vantien

  • 憂鬱的高中生
  • ***
  • 文章數: 118
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #1 於: 2006-09-12 20:45 »
先按 Ctrl + z 跳出來, 再按 bg 丟到背景
然後 ps 看一下 你那個 shell 的 pid 跟 top 的 pid
是多少, 然後就殺了吧..

你那個 top -b 要改成 top -bn 1 才行

蒼邪

  • 憂鬱的高中生
  • ***
  • 文章數: 199
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #2 於: 2006-09-13 20:42 »
引述: "vantien"
先按 Ctrl + z 跳出來, 再按 bg 丟到背景
然後 ps 看一下 你那個 shell 的 pid 跟 top 的 pid
是多少, 然後就殺了吧..

你那個 top -b 要改成 top -bn 1 才行


很感謝你的回覆呢 :lol:

不過我想還要按Ctrl + z就已經沒意義了……因為流程自動化很重要,如果還要人工,我想,寫程式就沒啥意義了@@

小弟之後查了一下可用top -b n 次數  -d 秒數
我想這樣應該可以

但我還是不知道怎麼在bash shell script裡面中止一個執行不停的指令…(當然不是按Ctrl+c或Ctrl+z來說) :(
*萬般帶不走,唯有業隨身**

vantien

  • 憂鬱的高中生
  • ***
  • 文章數: 118
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #3 於: 2006-09-14 06:07 »
要按 Ctrl +c 或 Ctrl+z 當然是在測試 shell 時才會用到.

至於你要在 shell 內中止指令, 還是用 kill 跟 killall
你的 shell 中 kill 執行不到是因為你前面的指令都一直在執行中.
跟本沒機會輪到 kill 那行執行.
你要改成把前面的指令"丟到背景"執行的才行,
要不然你 kill 那行是要等前面行執行完才會執行.
而你前面的指令都還沒執行完, kill 當然執行不到.
以你的 shell 為例

top -b >> /tmp/top.txt  &

在後面加個 & 丟到背景執行. 這樣後面的指令才會繼續執行到...
不過那是對於會一直在執行中的指令才需要用到

你改成 top -bn 1 後, 也用不到 kill 了.
另外你沒判斷 kill PIDVALUE 是否有值
在有的系統中 kill 後面是空值會殺掉所有執行中的行程....
或是改用 killall( cmd) 讓它自己找去.

蒼邪

  • 憂鬱的高中生
  • ***
  • 文章數: 199
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #4 於: 2006-09-17 12:25 »
引述: "vantien"
要按 Ctrl +c 或 Ctrl+z 當然是在測試 shell 時才會用到.

至於你要在 shell 內中止指令, 還是用 kill 跟 killall
你的 shell 中 kill 執行不到是因為你前面的指令都一直在執行中.
跟本沒機會輪到 kill 那行執行.
你要改成把前面的指令"丟到背景"執行的才行,
要不然你 kill 那行是要等前面行執行完才會執行.
而你前面的指令都還沒執行完, kill 當然執行不到.
以你的 shell 為例

top -b >> /tmp/top.txt  &

在後面加個 & 丟到背景執行. 這樣後面的指令才會繼續執行到...
不過那是對於會一直在執行中的指令才需要用到

你改成 top -bn 1 後, 也用不到 kill 了.
另外你沒判斷 kill PIDVALUE 是否有值
在有的系統中 kill 後面是空值會殺掉所有執行中的行程....
或是改用 killall( cmd) 讓它自己找去.



感謝你的回覆呢^^

我是沒想到用背景執行,來試試,判斷是否為空值,感謝你的提醒,我知道了 :D
*萬般帶不走,唯有業隨身**

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #5 於: 2006-09-18 10:23 »
引用

top -b >> /tmp/top.txt  &


給你參考一下
代碼: [選擇]

top -b >> /tmp/top.txt &
pid_of_top="$!"
sleep 5
kill -9 $pid_of_top


若你想複雜一點,還有 trap 及 wait 可以配合使用。

蒼邪

  • 憂鬱的高中生
  • ***
  • 文章數: 199
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #6 於: 2006-10-09 03:55 »
引述: "thyme"
引用

top -b >> /tmp/top.txt  &


給你參考一下
代碼: [選擇]

top -b >> /tmp/top.txt &
pid_of_top="$!"
sleep 5
kill -9 $pid_of_top


若你想複雜一點,還有 trap 及 wait 可以配合使用。


真是抱歉,過了快一個月才回來這看到之前小弟問的東西又有先進回了…

請問一下"$!"是什麼呢?man bash找不到@@,是否是"使用者在背景中執行的PID"??
*萬般帶不走,唯有業隨身**

wuposheng

  • 憂鬱的高中生
  • ***
  • 文章數: 172
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #7 於: 2006-10-09 10:05 »
引述: "蒼邪"
引述: "thyme"
引用

top -b >> /tmp/top.txt  &


給你參考一下
代碼: [選擇]

top -b >> /tmp/top.txt &
pid_of_top="$!"
sleep 5
kill -9 $pid_of_top


若你想複雜一點,還有 trap 及 wait 可以配合使用。


真是抱歉,過了快一個月才回來這看到之前小弟問的東西又有先進回了…

請問一下"$!"是什麼呢?man bash找不到@@,是否是"使用者在背景中執行的PID"??


$!是shell執行結果的回傳值

蒼邪

  • 憂鬱的高中生
  • ***
  • 文章數: 199
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #8 於: 2006-10-11 08:49 »
感謝您的回覆呢,但我測試的結果並不是這樣……

第一、直接在下指令後,用echo $$為取得目前bash PID,如果如您所說,那echo $!應該有值,但是並沒有@@

第二、用shell script寫的話,只有把指令丟到背景中執行時,用echo $!才會有值囉……
*萬般帶不走,唯有業隨身**

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #9 於: 2006-10-11 09:26 »
引述: "蒼邪"
感謝您的回覆呢,但我測試的結果並不是這樣……

第一、直接在下指令後,用echo $$為取得目前bash PID,如果如您所說,那echo $!應該有值,但是並沒有@@

第二、用shell script寫的話,只有把指令丟到背景中執行時,用echo $!才會有值囉……


$$ 是本程式 PID,
$! 是前面背景指令的 PID ,
$? 是前面指令的執行結果的回傳值。

蒼邪

  • 憂鬱的高中生
  • ***
  • 文章數: 199
    • 檢視個人資料
如何中斷執行不停的shell script??
« 回覆 #10 於: 2006-10-11 12:20 »
引述: "thyme"
引述: "蒼邪"
感謝您的回覆呢,但我測試的結果並不是這樣……

第一、直接在下指令後,用echo $$為取得目前bash PID,如果如您所說,那echo $!應該有值,但是並沒有@@

第二、用shell script寫的話,只有把指令丟到背景中執行時,用echo $!才會有值囉……


$$ 是本程式 PID,
$! 是前面背景指令的 PID ,
$? 是前面指令的執行結果的回傳值。


感謝先進的說明 :D
*萬般帶不走,唯有業隨身**