crontab

;每天早晚8点同步授时中心的时间
0 8,20 * * * ntpdate asia.pool.ntp.org >> /script/crontab.log

;每1分钟执行一次shell脚本,检测server的master进程是否存活,如果存在则跳过。如果发现主进程已经挂掉,则执行restart逻辑,先kill掉所有残留的子进程,然后重新启动Server。
*/1 * * * * /script/check_system_server.sh

;每天0点到8点每4小时执行一次reload.sh 保持mysql不断线
* 0-8/4 * * * /script/reload.sh

;每天下午3点执行
* 15 * * * /usr/local/php/bin/php /script/t.php >> /script/crontab.log

说明:
systemctl start crond
systemctl stop crond
systemctl restart crond
systemctl reload crond
systemctl status crond

开机自启动: systemctl enable crond.service

查看当前用户的crontab: 输入crontab -l 或 crontab -l -u root

编辑: crontab -e

格式: Minute Hour DayofMonth Month DayofWeek CommandPath

参数说明:
Minute:每个小时的第几分钟执行该任务;取值范围0-59
Hour:每天的第几个小时执行该任务;取值范围0-23
Day:每月的第几天执行该任务;取值范围1-31
Month:每年的第几个月执行该任务;取值范围1-12
DayOfWeek:每周的第几天执行该任务;取值范围0-6,0表示周末
CommandPath:指定要执行的程序路径

时间格式:
* :表示任意的时刻;如小时位 * 则表示每个小时
n :表示特定的时刻;如小时位 5 就表示5时
n,m :表示特定的几个时刻;如小时位 1,10 就表示1时和10时
n-m :表示一个时间段;如小时位 1-5 就表示1到5点
*/n : 表示每隔多少个时间单位执行一次;如小时位 */1 就表示每隔1个小时执行一次命令,也可以写成 1-23/1

实例:
30 21 * * * /etc/init.d/nginx restart //每晚的21:30重启 nginx。
45 4 1,10,22 * * /etc/init.d/nginx restart //每月1、 10、22日的4 : 45重启nginx。
10 1 * * 6,0 /etc/init.d/nginx restart //每周六、周日的1 : 10重启nginx。
0,30 18-23 * * * /etc/init.d/nginx restart //每天18 : 00至23 : 00之间每隔30分钟重启nginx。
0 23 * * 6 /etc/init.d/nginx restart //每星期六的11 : 00 pm重启nginx。
* */1 * * * /etc/init.d/nginx restart //每一小时重启nginx
* 23-7/1 * * * /etc/init.d/nginx restart //晚上11点到早上7点之间,每 隔一小时重启nginx
0 11 4 * mon-wed /etc/init.d/nginx restart //每月的4号与每周一到周三 的11点重启nginx
0 4 1 jan * /etc/init.d/nginx restart //一月一号的4点重启nginx
*/30 * * * * /usr/sbin/ntpdate 210.72.145.20 //每半小时同步一下时间

c++ 解决TCP粘包问题

#include < iostream>
#include < Windows.h>
#include < vector>
#include < string>
#include < algorithm>
#include < time.h>
#include < exception>

#pragma comment(lib,"ws2_32.lib")
using namespace std;

WSADATA wsaData;
SOCKET hSocket;
SOCKADDR_IN servAddr;

size_t readn(SOCKET socket, void* buf, size_t count)
{
	int left = count; //剩下的字节
	char* ptr = (char*)buf;
	while (left > 0)
	{

		int readBytes = recv(socket, ptr, left, 0);
		if (readBytes < 0)//read函数小于0有两种情况:1中断 2出错
		{
			if (errno == EINTR)//读被中断
			{
				continue;
			}
			return -1;
		}
		if (readBytes == 0)//读到了EOF
		{
			// 服务器关闭
			return count - left;
		}
		left -= readBytes;
		ptr += readBytes;
	}
	return count;
}

/// 从缓冲区中读取指定长度的数据,但不清除缓冲区内容
size_t read_peek(int sockfd, char *buf, size_t len)
{
	while (1)
	{
		int ret = recv(sockfd, buf, len, MSG_PEEK);
		if (ret == 0)
		{
			std::cout << "服务器连接断开!!!" << std::endl;
			return 0;
		}
		if (ret == -1 && errno == EINTR)
		{
			//出现中断
			continue;
		}
		return ret;
	}
}

/// 按行读取数据
/// sockfd : 套接字
/// buf :应用层缓冲区,保存读取到的数据
/// maxline : 所规定的一行的长度
size_t readLine(int sockfd, void *buf, size_t maxline)
{
	int ret;
	int nRead = 0;
	int left = maxline; //剩下的字节数
	char * pbuf = (char *)buf;
	int count = 0;
	while (1)
	{
		ret = read_peek(sockfd, pbuf, left);   //读取长度为left的socket缓冲区内容
		if (ret <= 0)
		{
			return ret;
		}
		nRead = ret;
		for (int i = 0; i < nRead; i++)//看看读取出来的数据中是否有换行符\n
		{
			if (pbuf[i] == '\n')//如果有换行符
			{
				ret = readn(sockfd, pbuf, i + 1);//读取一行
				if (ret != i + 1)	//一定会读到i+1个字符,否则是读取出错
				{
					exit(EXIT_FAILURE);
				}
				return ret + count;
			}
		}
		
		//窥探的数据中并没有换行符
		//把这段没有\n的读出来
		ret = readn(sockfd, pbuf, nRead);
		if (ret != nRead)
		{
			exit(EXIT_FAILURE);
		}
		pbuf += nRead;
		left -= nRead;
		count += nRead;
	}
	return -1;
}

int main()
{
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		cout << "WSAStartup() error" << endl;
		return -1;
	}

	hSocket = socket(PF_INET, SOCK_STREAM, 0);
	if (hSocket == INVALID_SOCKET)
	{
		cout << "hSocket() error" << endl;
		return -1;
	}

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	servAddr.sin_family = AF_INET;
	servAddr.sin_port = htons(8888);

	if (connect(hSocket, (SOCKADDR*)& servAddr, sizeof(SOCKADDR)))
	{
		cout << "连接失败!" << endl;
		closesocket(hSocket);
		WSACleanup();

		return -1;
	}

	while (true)
	{
		int ret = readLine(hSocket, recvbuf, 1024);
		if (ret == -1)
		{
			cerr << "readline" << endl;
		}
		else if (ret == 0)
		{
			printf("service closed\n");
			break;
		}
		string ttt = recvbuf;
		cout << ttt.substr(0, ret);
		memset(recvbuf, 0, sizeof(recvbuf));
	}
	return 0;
}