Remote

“錯誤:程序 ID 列表語法錯誤”

  • September 7, 2018

我有一個 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

引用自:https://unix.stackexchange.com/questions/463936