【发布时间】:2015-08-27 22:19:21
【问题描述】:
我使用system() 库函数编写了一个函数,如下所示:
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;
}
然后,我用下面的 shell 脚本调用它:
#!/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
但有时会有一个奇怪的返回码 2,如下所示:
[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
我想了解为什么返回码是 2。
================新 2015/06/12 13:54====================== ======
我发现当system()返回2时,bash的错误信息如下:
bash: xmalloc: locale.c:73: cannot allocate 2 bytes (0 bytes allocated)
【问题讨论】:
-
这是一个格式很好的问题。无需改进。顺便说一句,原因可能在
return ret后面,其中ret = system(cmd)。system(cmd)可能等于2。 -
@JamesSmith 如果
system返回2,那么他会遇到!= -1的情况,WIFEXITED应该返回 false,ret应该设置为-1我相信。跨度> -
顺便说一句。查看
pgrep而不是您的管道,eval完全没有必要。 -
@EtanReisner 抱歉,我一定忽略了这一点。但是,
WEXITEDSTATUS(ret)会返回 2 吗? -
@EtanReisner 如果 eval 失败,那么这个脚本会提前退出并返回 2?