2013-10-23 35 views
4

我想爲我的機器上運行的matlab作業創建一個輕量級內存分析器。有一個或零個matlab作業實例,但其進程ID經常更改(因爲它實際上是由另一個腳本調用的)。如何獲得手錶使用引號運行bash腳本

因此,這裏是bash腳本,我放在一起登錄內存使用:

#!/bin/bash 
pid=`ps aux | grep '[M]ATLAB' | awk '{print $2}'` 
if [[ -n $pid ]] 
then 
    \grep VmSize /proc/$pid/status 
else 
    echo "no pid" 
fi 

當我運行該腳本在bash這樣的:

./script.sh 

它工作得很好,給我以下結果:

VmSize: 1289004 kB 

這正是我想要的。

現在,我想定期運行它。所以我watch運行它,就像這樣:

watch ./script.sh 

但在這種情況下,我只能接受:

no pid 

請注意,我知道了MATLAB作業仍在運行,因爲我可以看到它top上的同一個pid,此外,我知道每個matlab作業需要幾個小時才能完成。

我很確定在設置pid時引號有什麼問題。我只是無法弄清楚如何解決它。任何人都知道我做錯了什麼?

PS。 在watch的手冊頁中,它表示命令由sh -c執行。我確實運行了像sh -c ./script這樣的腳本,它工作的很好,但watch沒有。

+1

+1爲合理的問題(和格式化!)。最可能的解釋是,當'watch'決定檢查它時,matlab沒有運行。我會插入'ps aux | grep'[M] ATLAB''上面'pid = ...'行的行,看看你的腳本是否找到了。你看過「男士手錶」嗎?有沒有關於同步搜索的任何線索,比如你的嘗試?祝你好運! – shellter

+0

謝謝@shellter。我應該在這個問題中提到這個問題:matlab確實在運行。我可以一直使用相同的pid在頂部看到它。我也從工作中知道matlab運行時需要幾個小時,並且在我運行'watch'時不會被終止。我會更新這個問題來反映這一點。 – farmir

+0

我剛剛測試過你的腳本。但它在我的電腦上工作得很好! –

回答

1

pid=`ps aux | grep '[M]ATLAB' | awk '{print $2}'` 

可改爲:

pid=$(pidof MATLAB) 
+0

謝謝。您的建議有效。如果想要查找腳本,我只需要使用'pidof -x'。或者用'pgrep'代替。 雖然我仍然不知道手錶爲什麼不能在我的grep MATLAB中首先使用:)稍等一會兒,看看有沒有人解釋過這個問題,或者如果我有機會親自查看更多內容。否則會接受你的。 – farmir

3

爲什麼不使用睡眠命令的循環呢?

例如:

#!/bin/bash 
pid=`ps aux | grep '[M]ATLAB' | awk '{print $2}'` 

while [ "1" ] 
do 
if [[ -n $pid ]] 
then 
    \grep VmSize /proc/$pid/status 
else 
    echo "no pid" 
fi 
sleep 10 
done 

這裏腳本睡(等待)10秒。您可以設置您需要更改睡眠命令的時間間隔。例如,要使腳本睡眠一小時,請使用sleep 1h

要退出腳本按Ctrl - Visual C

+0

謝謝。這工作。但我只是最終使用Jotne的建議,因爲它有點簡單:) – farmir

1

我不知道爲什麼它不是在手錶工作,但你可以使用一個cron作業並將腳本記錄到文件中,如下所示:

#!/bin/bash 
pid=$(pidof MATLAB) # Just to follow previously given advice :) 
if [[ -n $pid ]] 
then 
    echo "$(date): $(\grep VmSize /proc/$pid/status)" >> logfile 
else 
    echo "$(date): no pid" >> logfile 
fi 

你當然必須創建觸摸日誌文件。

+0

與我的問題沒有什麼關係:我在這個腳本之外進行日誌記錄,但僅僅爲了記錄,我認爲(並且只是在我的機器上測試/確認),您並不需要先觸摸日誌文件。如果它不存在,它會自動創建。 – farmir

0

你可能試着在監視中運行ps命令。過去我曾經遇到過手錶切割線等問題,因爲它們太長了。

可以通過使終端從更寬的範圍運行命令或更改此列(可能需要根據自己的喜好調整160)來修復它: export COLUMNS = 160;