现在我正在使用此脚本重新启动我的进程:
PID=`ps -ef|grep -w ${APP_NAME}|grep -v grep|cut -c 9-15`
if [[ ${PID} -gt 1 ]]; then
kill -9 ${PID}
else
echo "Process not found"
fi
但是当我从 GitHub Actions 在远程服务器中运行此脚本时,显示此错误:
======CMD======
cd /opt/apps/dolphin-acientbay/libs
. /opt/apps/dolphin-acientbay/libs/upgrade.sh
======END======
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:13> JAVA_HOME=/***/.sdkman/candidates/java/11.0.11.hs-adpt
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:14> APP_HOME=/opt/apps/dolphin-acientbay/libs
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:15> APP_NAME=dolphin-acientbay-service-1.0.0-SNAPSHOT.jar
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> PID=+/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> ps -ef
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> PID=+/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> grep -w dolphin-acientbay-service-1.0.0-SNAPSHOT.jar
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> PID=+/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> grep -v grep
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> PID=+/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> cut -c 9-15
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:17> PID=' 19882 '
2021/05/30 11:46:21 Process exited with status 1
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:18> [[ ' 19882 ' -gt 1 ]]
err: +/opt/apps/dolphin-acientbay/libs/upgrade.sh:19> kill -9 ' 19882 '
err: /opt/apps/dolphin-acientbay/libs/upgrade.sh:kill:19: illegal pid: 19882
这是完整的脚本upgrade.sh
:
#!/usr/bin/env bash
set -u
set -e
set -x
JAVA_HOME="/root/.sdkman/candidates/java/11.0.11.hs-adpt"
APP_HOME="/opt/apps/dolphin-acientbay/libs"
APP_NAME="dolphin-acientbay-service-1.0.0-SNAPSHOT.jar"
PID=`ps -ef|grep -w ${APP_NAME}|grep -v grep|cut -c 9-15`
if [[ ${PID} -gt 1 ]]; then
kill -9 ${PID}
else
echo "Process not found"
fi
sleep 5
count=`ps -ef | grep ${APP_NAME} | grep -v "grep" | wc -l`
if [[ ${count} -lt 1 ]]; then
nohup ${JAVA_HOME}/bin/java -Xmx128M -Xms128M -jar \
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=0.0.0.0:5021 \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/apps/dolphin-acientbay/ \
${APP_HOME}/${APP_NAME} >> ./acientbay.log &
sleep 5
else
echo "process aready exists!"
exit 1
fi
我尝试像这样调整终止进程命令(xargs 修剪 pid 的空格)以删除 pid 的空格:
echo "${PID}" | xargs | kill -9
它告诉我:
err: /opt/apps/dolphin-acientbay/libs/upgrade.sh:kill:19: not enough arguments
答案1
这是您的问题的根源:
PID=`ps -ef|grep -w ${APP_NAME}|grep -v grep|cut -c 9-15`
使用变量时用双引号引起来。例如“$APP_NAME”或“${APP_NAME}”。
顺便说一句,仅当您需要消除变量与字符串中其他文本的歧义时才需要大括号。例如,如果该变量实际上是,
$APP
但您需要在字符串中使用它_NAME
,则可以使用"${APP}_NAME"
- 这将防止_NAME
shell 将其解释为变量名称的一部分。您正在使用反引号而不是
$()
.它们已被弃用多年,并且有充分的理由。它们不是问题的根源,只是您需要戒掉的坏习惯。cut
不是提取可由 1 个或多个字符分隔的字段的好工具。仅当字段之间只有一个(且恰好是一个)分隔符时才有效。许多文本文件使用 1 个或多个空格(和/或制表符和/或其他空白字符)作为字段分隔符,并且不能轻松地使用cut
.使用awk
或perl
代替。您使用
cut -c 9-15
会导致 $PID 中至少捕获一个额外的空格字符。要从 中提取 PIDps -ef
,请使用awk '{print $2}'
代替cut -c 9-15
。用于
pgrep "$APP_NAME"
按名称获取进程的 PID。或者,pgrep -f "$APP_NAME"
如果您正在搜索的字符串是一个参数(例如,当脚本的名称作为参数传递给解释器时)。货物崇拜
ps | grep ... | grep -v grep
已经过时了几十年——而且无论如何都不是一个好方法。 始终是一个更好的方法(在模式的第一个字符周围ps -ef | awk '/[p]rocess_name/ {print $2}'
放置 a可以防止 awk、grep 或其他任何东西在 ps 输出中匹配自身),但即使这样现在也已经被.[]
pgrep
ps
它本身有一个-C
用于匹配进程名称的选项,一个h
用于抑制标头的选项,以及-o
一个指定您想要的输出的选项ps
。例如ps h -o pid -C "$APP_NAME"
总结一下,使用:
PID=$(pgrep "$APP_NAME")
or
PID=$(pgrep -f "$APP_NAME")
or
PID=$(ps h -o pid -C "$APP_NAME")
顺便说一句,如果有任何pgrep
由于or返回多个 PID 的可能性ps
,您应该将输出捕获到数组中,而不是捕获到标量变量中。例如,以下命令会将所有可见 bash 进程的 PID 捕获到数组中$BASHPIDS
。
$ BASHPIDS=( $(ps h -o pid -C bash) )
$ typeset -p BASHPIDS
declare -a BASHPIDS=([0]="68910" [1]="71059" [2]="71634" [3]="71641" [4]="71643"
[5]="71680" [6]="71683" [7]="71684" [8]="71687" [9]="71693" [10]="71712" [11]="72394"
[12]="72568" [13]="72589" [14]="970222" [15]="974740" [16]="1078757" [17]="1278073"
[18]="1365082" [19]="1405642" [20]="1458889" [21]="2278763" [22]="2466442" [23]="2876831"
[24]="2955565" [25]="3260896" [26]="3261235" [27]="3269020" [28]="3281961" [29]="3702104"
[30]="4038149")
如果出于某种原因,你想把他们全部杀死,你可以这样做:
kill "${BASHPIDS[@]}"
答案2
这个命令解决了这个问题:
echo "${PID}" | xargs kill -9