0

我正在检查远程服务器上的进程是否已被杀死。我正在使用的代码是:

if [ `ssh -t -t -i id_dsa headless@remoteserver.com "ps -auxwww |grep pipeline| wc -l" | sed -e 's/^[ \t]*//'` -lt 3 ]
then 
  echo "PIPELINE STOPPED SUCCESSFULLY"
  exit 0
else
  echo "PIPELINE WAS NOT STOPPED SUCCESSFULLY"
  exit 1
fi

但是,当我执行此操作时,我得到:

    : integer expression expected
PIPELINE WAS NOT STOPPED SUCCESSFULLY
1

返回的实际值为“1”,没有空格。我通过以下方式进行了检查:

vim <(ssh -t -t -i id_dsa headless@remoteserver.com "ps -auxwww |grep pipeline| wc -l" | sed -e 's/^[ \t]*//')

然后是 ":set list",它只显示整数和换行符作为返回值。

我不知道为什么这不起作用。

4

3 回答 3

1

如果ssh命令的输出确实只是一个前面有可选制表符的整数,那么您不需要该sed命令;在将其用作运算符的操作数之前,shell 将去除不必要的前导和/或尾随空格-lt

if [ $(ssh -tti id_dsa headless@remoteserver.com "ps -auxwww | grep -c pipeline") -lt 3 ]; then

ssh手动运行时的结果可能与在 shell 中运行时的结果不同。您可以尝试将其保存在变量中,以便在脚本中对其进行测试之前将其输出:

result=$( ssh -tti id_dsa headless@remoteserver.com "ps -auxwww | grep -c pipeline" )
if [ $result -lt 3 ];
于 2013-07-31T16:59:16.577 回答
0

正如用户 mbratch 注意到的那样,除了预期的“\n”之外,我还在返回值中得到了一个“\r”。所以我更改了我的 sed 脚本,以便它去掉“\r”而不是空格(chepner 指出这是不必要的)。

sed -e 's/\r*$//'
于 2013-07-31T18:14:03.723 回答
0

你得到的返回值并不完全是一个数字。也许一些shell元字符/换行符/任何进入你的方式:

#!/bin/bash

var=$(ssh -t -t -i id_dsa headless@remoteserver.com "ps auxwww |grep -c pipeline")

echo $var

# just to prove my point here 
# Remove all digits, and look wether there is a rest -> then its not integer
test -z "$var" -o -n "`echo $var | tr -d '[0-9]'`" && echo not-integer

# get out all the digits to use them for the arithmetic comparison
var2=$(grep -o "[0-9]" <<<"$var")

echo $var2


if [[ $var2 -lt 3 ]]
then
    echo "PIPELINE STOPPED SUCCESSFULLY"
    exit 0
else
    echo "PIPELINE WAS NOT STOPPED SUCCESSFULLY"
    exit 1
fi
于 2013-07-31T17:32:13.313 回答