Agora estou usando este script para reiniciar meu processo:
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
mas quando executo este script no servidor remoto do GitHub Actions, mostra este erro:
======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
este é o script completo de 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
Eu tentei ajustar o comando kill process assim (os xargs cortam o espaço em branco do pid) para remover os espaços do pid:
echo "${PID}" | xargs | kill -9
isso me diga:
err: /opt/apps/dolphin-acientbay/libs/upgrade.sh:kill:19: not enough arguments
Responder1
Aqui está a origem do seu problema:
PID=`ps -ef|grep -w ${APP_NAME}|grep -v grep|cut -c 9-15`
Coloque aspas duplas em suas variáveis ao usá-las. por exemplo, "$APP_NAME" ou "${APP_NAME}".
Aliás, as chaves só são necessárias quando você precisa desambiguar uma variável de outro texto em uma string. por exemplo, se a variável fosse realmente,
$APP
mas você precisasse usá-la em uma string com_NAME
, você usaria"${APP}_NAME"
- isso evitaria_NAME
ser interpretado pelo shell como parte do nome da variável.Você está usando crases em vez de
$()
. Eles estão obsoletos há anos e por um bom motivo. Eles não são a causa do problema aqui, apenas um mau hábito que você precisa abandonar.cut
não é uma boa ferramenta para extrair campos que podem ser delimitados por 1 ou mais caracteres. Só é bom quando há um (e exatamente um) delimitador entre os campos. Muitos arquivos de texto usam 1 ou mais espaços (e/ou tabulações e/ou outros caracteres de espaço em branco) como delimitadores de campo e não podem ser facilmente processados comcut
. Useawk
ouperl
em vez disso.O uso de
cut -c 9-15
está fazendo com que pelo menos um caractere de espaço extra seja capturado em $PID. Para extrair um PID deps -ef
, useawk '{print $2}'
em vez decut -c 9-15
.Use
pgrep "$APP_NAME"
para obter o PID de um processo por nome. Oupgrep -f "$APP_NAME"
se a string que você está procurando for um argumento (por exemplo, quando o nome do script é passado como argumento para um intérprete).O culto à carga
ps | grep ... | grep -v grep
está obsoleto há décadas – e, de qualquer forma, nunca foi uma boa maneira de fazê-lo.ps -ef | awk '/[p]rocess_name/ {print $2}'
sempre foi uma maneira melhor (colocar um[]
em torno do primeiro caractere do padrão evita que awk, ou grep, ou qualquer outra coisa, corresponda a si mesmo na saída ps), mas mesmo isso agora está obsoleto compgrep
.ps
em si tem uma-C
opção para combinar nomes de processos e umah
opção para suprimir cabeçalhos e-o
especificar de qual saída você desejaps
. por exemplops h -o pid -C "$APP_NAME"
Para resumir tudo isso, use:
PID=$(pgrep "$APP_NAME")
or
PID=$(pgrep -f "$APP_NAME")
or
PID=$(ps h -o pid -C "$APP_NAME")
Aliás, se houverqualquerchance de vários PIDs serem retornados por pgrep
ou ps
, você deve capturar a saída em uma matriz, não em uma variável escalar. Por exemplo, o seguinte irá capturar os PIDs de todos os processos bash visíveis no array $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")
se, por algum motivo, você quisesse matar todos eles, poderia fazê-lo com:
kill "${BASHPIDS[@]}"
Responder2
este comando corrige o problema:
echo "${PID}" | xargs kill -9