Tôi đã mã hóa một hàm sử dụng system()
chức năng thư viện như sau:hệ thống() thỉnh thoảng trả 2
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;
}
Sau đó, tôi gọi nó với một kịch bản shell như sau:
#!/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
Nhưng đôi khi có là mã trả về kỳ lạ của 2, như sau:
[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
Tôi muốn hiểu lý do tại sao là mã trả lại là 2.
================ mới 2015/06/12 13:54 ============== ==============
tôi đã phát hiện ra rằng khi hệ thống() trả về 2, đã có một thông báo lỗi của bash như sau:
bash: xmalloc: locale.c:73: cannot allocate 2 bytes (0 bytes allocated)
Đây là câu hỏi được định dạng rất tốt. Không cần cải thiện. Cũng giống như một lưu ý phụ, lý do có thể nằm sau 'return ret', trong đó' ret = system (cmd) '. 'system (cmd)' có thể là equsl '2'. – HyperNeutrino
@JamesSmith Nếu 'system' trả về' 2' thì anh ta sẽ nhấn vào trường hợp '! = -1' và' WIFEXITED' sẽ trả về false và 'ret' nên được đặt thành' -1' tôi tin. –
Là một sang một bên. Nhìn vào 'pgrep' thay vì đường ống của bạn và' eval' là hoàn toàn không cần thiết. –