再linux下定时重启只能精确到分钟。但有时项目的需要,要定时几秒关机。于是想出 了以下的方法:

例如我需要延时5秒重启linux系统

1.时间向前调整60-5秒,例如现在的时间为17:02:01,调整为17:01:06

2.定时1分钟重启linux,即在17:02:06重启电脑

3.时间调回原来的时间,即调为17:02:01

这样冲17:02:01到17:02:06关闭电脑,所经历的时间刚好为5秒

下面为我的代码

/*执行shell指令,并获取返回*/
static char* shellExec(char* command)
{
	static char buf[2048] = {0};
	char* outStr = NULL;
	char line[256]={0};
	FILE* fp=NULL;
	memset(buf,0,2048);
	fp = popen(command,"r");
	if(fp)
	{
		while(fgets(line,sizeof(line),fp) != NULL)
		{
			strcat(buf,line);
		}
		outStr = buf;
	} 
	fclose(fp);
	return outStr;
}

/*定时系统在(1-59)秒之后重启*/
void rebootAfter(unsigned int secons)
{
	time_t t;
    struct tm * lt;
	char cmd[32]={0};
    time (&t);          //获取Unix时间戳。

	if(secons > 59)return;
    
    t -= (60-secons);   //先将系统时间向前调整
    lt = localtime (&t);//转为时间结构。
	sprintf (cmd,"/bin/date -s %02d:%02d:%02d",lt->tm_hour, lt->tm_min, lt->tm_sec);
	shellExec(cmd);
	
	shellExec("/sbin/shutdown -r +1");  //定时1分钟之后关机
	
	t += (60-secons);              //调整回系统时间
	lt = localtime (&t);         
	sprintf (cmd,"/bin/date -s %02d:%02d:%02d",lt->tm_hour, lt->tm_min, lt->tm_sec);
	shellExec(cmd);
}

当然,有的人说可以直接使用sleep

wall 'The System Will Shutdown In 10 secs!' && sleep 10 && shutdown -h now

但是这个指令会阻塞,而上面的方法不会阻塞。有时候需要在指定定时重启之后做一些其他的事情,所以不希望被阻塞。

提醒:以上的方法不是所有的系统都可以实现,需要根据实际情况使用

Logo

更多推荐