“錯誤:程序 ID 列表語法錯誤”
我有一個 bash 腳本,它登錄到遠端伺服器,並檢查在該伺服器上執行的所需腳本的實例數
script.py
,然後回顯該腳本在該節點上消耗的總記憶體,以及一些匯總統計資訊,例如存在的總記憶體以及與腳本關聯的所有程序消耗的記憶體。這是程式碼:#!/bin/sh for server in servername; do ssh $server << EOF num_proc=0 sum_virt=0 procs=$(pgrep -f script.py) if [[ "$procs" ]]; then for pid in $(pgrep -f script.py); do x=`ps -p $pid -o %cpu,%mem,cmd,vsize` virt=`echo $x | cut -d " " -f 9` sum_virt=`echo "$virt + $sum_virt" | bc -l` let "num_proc++" done total_mem_cons=`vmstat -n -s | grep "used memory" | awk '{print $1}'` tot_mem=`vmstat -n -s | grep "total memory" | awk '{print $1}'` echo "Total Memory Consumption on node $server: $total_mem_cons" echo "Total memory on node $server: $tot_mem" else echo "No script.py process running on node $server" fi EOF done
但是,這給了我這個錯誤:
error: process ID list syntax error Usage: ps [options] Try 'ps --help <simple|list|output|threads|misc|all>' or 'ps --help <s|l|o|t|m|a>' for additional help text. For more details see ps(1). (standard_in) 1: syntax error
此外,儘管我手動登錄伺服器時存在程序,但它似乎進入了 else 狀態。
我沒有看到腳本有任何問題,我嘗試單獨輸出命令以查看問題所在,但找不到問題所在。單獨執行
ps -p $pid -o %cpu,%mem,cmd,vsize
似乎給了我正確的輸出,這表明循環通過pid
’s 的循環有問題,但我真的不知道可能出了什麼問題。編輯:我使用以下測試程式碼來測試基本功能,這似乎也返回空:
#!/bin/sh for server in servername; do ssh $server << EOF num_proc=0 sum_virt=0 pgrep -f script.py | while read -r pid ; do echo "PID: $pid" done total_mem_cons=`vmstat -n -s | grep "used memory" | awk '{print $1}'` tot_mem=`vmstat -n -s | grep "total memory" | awk '{print $1}'` echo "Total Memory Consumption on node $server: $total_mem_cons" echo "Total memory on node $server: $tot_mem" EOF done
即它返回的只是:
PID: PID: PID: Total Memory Consumption on node servname: Total memory on node servername:
這意味著即使記憶體消耗輸出也為零。再次在單個伺服器上測試命令,似乎給出了正確的結果。
如中所述
man bash
(請注意,您/bin/sh
可能不是 bash,但同樣適用於其他類似 Bourne 的 shell):The format of here-documents is: <<[-]word here-document delimiter No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word. If any charac‐ ters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, the charac‐ ter sequence \<newline> is ignored, and \ must be used to quote the characters \, $, and `.
了解您的案例的關鍵部分是
如果 word 沒有被引用,則 here-document 的所有行都經過參數擴展、命令替換和算術擴展
這意味著諸如
$pid
,$x
等等之類的東西將具有來自本地 shell 的值,而不是來自遠端 SSH 會話。錯誤error: process ID list syntax error
$pid
與命令替換中為空一致ps -p $pid -o %cpu,%mem,cmd,vsize
請注意,如果您引用了變數擴展 - 這是一個好習慣
ps -p "$pid" -o %cpu,%mem,cmd,vsize
你會有一個稍微有用的錯誤
list of process IDs must follow -p
您可以通過反斜杠轉義它們來防止單個變數過早擴展,例如
\$pid
,但是在您的情況下,您唯一要擴展的是$server
- 這在此處文件之外,因此您也可以通過引用自身來防止任何擴展:word
for server in servername; do ssh $server << 'EOF' . . EOF done