I wie unten unter Verwendung einer Funktion system()
Bibliotheksfunktion codiert haben:System() gibt gelegentlich 2
#!/bin/sh
PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
cd $(dirname $0)
agent_name=`grep 'agent_name' ../etc/config.ini |awk '{ print $3 }'`
py='../../python26/bin/python'
check_alive()
{
status=`ps -ef | grep "$agent_name" | grep -v "grep" |wc -l`
if [ $status -ne 0 ]; then
# process exist
echo "$agent_name already exist"
exit 1
fi
}
check_alive
eval '$py ../bin/agent.py -d'
status=`ps -ef | grep "$agent_name" | grep -v "grep" |wc -l`
if [ $status -lt 1 ]
then
echo "run failed"
exit -1
else
echo "run succ"
exit 0
fi
Aber manchmal gibt:
int execute(const char* cmd)
{
int ret = system(cmd);
if (ret != -1)
{
if (WIFEXITED(ret))
ret = WEXITSTATUS(ret);
else
ret = -1;
}
LINFO("execute %s, ret = %d", cmd, ret); // logging
return ret;
}
Dann habe ich es mit einem Shell-Skript, wie unten genannt war ein ungeraden Rückkehrcode von 2, wie unten:
[INFO]execute ./admin/trystart.sh, ret = 1
[INFO]execute ./admin/trystart.sh, ret = 1
[INFO]execute ./admin/trystart.sh, ret = 2
[INFO]execute ./admin/trystart.sh, ret = 2
[INFO]execute ./admin/trystart.sh, ret = 1
[INFO]execute ./admin/trystart.sh, ret = 1
[INFO]execute ./admin/trystart.sh, ret = 1
[INFO]execute ./admin/trystart.sh, ret = 1
[INFO]execute ./admin/trystart.sh, ret = 1
[INFO]execute ./admin/trystart.sh, ret = 2
Ich möchte verstehen, warum dort ein Return-Code von 2 war
================ neue 2015.06.12 13.54 ============== ==============
ich habe festgestellt, dass, wenn das System() 2 ergibt, gibt eine Fehlermeldung aus, wie unten bash war:
bash: xmalloc: locale.c:73: cannot allocate 2 bytes (0 bytes allocated)
Dies ist eine sehr gut formatiert Frage. Keine Verbesserung benötigt. Nur als Randnotiz kann der Grund hinter "return ret" stehen, wobei "ret = system (cmd)". 'system (cmd)' könnte äqusl '2' sein. – HyperNeutrino
@JamesSmith Wenn 'system' zurück '2' dann würde er traf den'! = -1' Fall und 'WIFEXITED' sollte false zurück und' ret' auf 'gesetzt werden soll -1' glaube ich. –
Als beiseite. Suchen Sie in Ihrer Pipeline nach 'pgrep' und das 'eval' ist völlig unnötig. –