qnx挂死恢复脚本简易写法

接触qnx两天,拿到手上的板子bsp软件已经被定制过,将启动脚本的位置和文件系统做了大量更改

如下是几个命令来处理退出和恢复过程

由于tinyRPC接口不提供退出接口,商务又不允许改接口,就采用低级的风险的退出方式exit(),远端服务端使用了ip,port转发等鬼东西,socket端口访问总是无法访问,于是用ping来查询远程机器是否启动来代替查询远程tinyRPC服务器是否运行,但exit退出方法会引起内存泄漏,从代码端检测到连接断开退出进程的写法

void t_resume()
{
//	TSocketConnect::Inst()->SetIPAddr("192.168.1.5", 32769);
//	std::cout << "[bgk] set ipaddr...192.168.1.5....<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
//
//	while(1)
//	{
//		sleep(10);
//		std::cout << "[bgk] sleep 10s, connect_sts = " << TSocketConnect::Inst()->SocketConnectStatus() << endl;
//
//		if (!TSocketConnect::Inst()->SocketConnectStatus())
//		{
//			// TRPCClientMgr::Inst()->Exit();
//			// break;
//		}
//	}
//	// exit(1);

	FILE * fp;
	char buffer[20];
	char cmp[20];

	while(1)
	{
		sleep(10);

		memset(buffer, 0, 20);
		memset(cmp, 0, 20);

		fp = popen("echo $(echo `ping -c 1 10.255.255.100`) | grep 'time=' ", "r");
		fgets(buffer, sizeof(buffer), fp);
		// std::cout << buffer << std::endl;
		pclose(fp);

		if(!memcmp(cmp, buffer, 20))
		{
			std::cout << "exit tinyrpc_service" << std::endl;
			exit(1);
		}
	}

}

 

在启动脚本了做个检测,发现远程服务器连接上之后再发起tinyRPC客户端的连接,想用telnet来过滤,命令没有,ssh命令没有,好在加命令相对简单,但加上去之后发现telnet和socket一样无法访问远程端口,很多linux上稳定运行的工具都没法使用,最后只能采用极端的方法了,在qnx启动脚本里运行一个后台shell脚本来监控远程服务器,一旦起来就运行tinyRPC

#!/bin/sh

# Import environment
basepath=$(cd `dirname $0`; pwd -P)

. $basepath/env_setup.sh

while true
do
	sleep 3
	result=$(echo `ps -e -o pid,comm | grep "tinyrpc_service" | grep -v PID | grep -v grep`)
	# echo $result
	if [[ "$result" != "" ]]
	then
		# echo "tinyrpc runing"
		sleep 1
	else
		result=$(echo $(echo `ping -c 1 10.255.255.100`) | grep "time=")
		if [ "${result}" != "" ]
		then
			echo "tinyrpc resume"
			tinyrpc_service &
		fi
	fi
done

现有的指令得到两列结果(602151 vcapture-test)
如果想得到单独的pid号,可以在加awk指令过滤(602151)

echo `ps -e -o pid,comm | grep "vcapture-test" | grep -v PID | grep -v grep | awk '{print $1}'`

 

其他:

在qnx文件系统里加命令方法,在src\hardware\startup\boards\dra72x\evm\build目录下general commands段中加入需要的命令

qnx挂死恢复脚本简易写法_第1张图片

telnet访问端口脚本如下,linux上很好用,但qnx用起来有点莫名其妙,感觉不是每次返回都是确定了

#!/bin/sh

num=`echo -n "\n"|telnet 127.0.0.1 32769|grep Connected|wc -l`

if [ $num -eq 1 ]; then
	echo "network is open."
else
	echo "network is closed."
fi

Socket端口在Linux上默认打开方式为非阻塞的,但在Qnx的默认打开方式为阻塞的,解决方法为设置非阻塞标志位

int sockfd;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);

 

 

你可能感兴趣的:(qnx)