首先说一下Ubuntu下看门狗程序,这个程序是用在我项目中的,用来保证核心程序能够实现崩溃自启动,这对于程序的稳定运行至关重要。

话不多少,直接上代码:

(1)新建看门狗程序 daemon_upload.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <dirent.h>
#include <sys/types.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/stat.h> #define READ_BUF_SIZE 1024
#define pidName "/home/node/nodeClient/Icardclient1/uploadFile.js"char pid[10];void init_daemon(void);//守护进程初始化函数int get_pid(void);main()
{FILE *fp;time_t t;init_daemon();//初始化为Daemonwhile(1)//每隔一分钟向test.log报告运行状态{sleep(5);//睡眠5秒钟int i = 0;i = get_pid();if (i == 0 ){if((fp=fopen("/home/node/nodelog/uploadFile.log","a")) >=0){t=time(0);fprintf(fp,"iclient.js don't exist at %s\n",asctime(localtime(&t)));int ret = 0;char s[500];char *command = "/home/node/bin/node  /home/node/nodeClient/Icardclient1/uploadFile.js";memset(s,0,sizeof(s));strcpy(s,command);ret = system(s);if( ret < 0){t=time(0);fprintf(fp,"iclient.js reboot failed at %s\n",asctime(localtime(&t)));}else{t=time(0);fprintf(fp,"iclient.js reboot succeed at %s\n",asctime(localtime(&t)));}fclose(fp);}}}}int get_pid(void)
{DIR *dir;struct dirent *next;int i=0;FILE *status;char buffer[READ_BUF_SIZE];char name[READ_BUF_SIZE];dir=opendir("/proc");if(!dir){printf("Can't open /proc\n");return 0;}while((next=readdir(dir))!=NULL){if((strcmp(next->d_name,"..")==0||strcmp(next->d_name,".")==0)){continue;}if(!isdigit(*next->d_name)){continue;}sprintf(buffer,"/proc/%s/status",next->d_name);if(!(status=fopen(buffer,"r"))){continue;}if(fgets(buffer,READ_BUF_SIZE,status)==NULL){fclose(status);continue;}fclose(status);sscanf(buffer,"%*s%s",name);if(strcmp(name,pidName)==0){//printf("%s\n",next->d_name);strcpy(pid,next->d_name);printf("%s\n",pid);i = 1;}}closedir(dir);return i;
}void init_daemon(void)
{ int pid; int i; if(pid=fork()) exit(0);else if(pid< 0) exit(1);setsid();if(pid=fork()) exit(0);else if(pid< 0) exit(1);for(i=0;i< NOFILE;++i)close(i); chdir("/");umask(0);return;
}

注意:代码是可以直接拿来用的,不过需要修改一下代码部分地方,主要是代码中几个文件路径,你需要提前建立好文件夹以及文件。

(2)将daemon_upload.c文件通过g++编译成可执行文件node_upload

g++ -o daemon_upload.c node_upload

(3)基于.destop文件实现程序的开机自启动

ubuntu下有很多中开机自动运行程序的方法,在开机的不同过程中可以启动不同的程序.如在开机启动时自动运行程序,是通过修改放置在
     /etc/rc或 
     /etc/rc.d 或 
     /etc/rc?.d 
   目录下的脚本文件,可以使init自动启动其它程序。例如:编辑 
     /etc/rc.d/rc.local 文件(该文件通常是系统最后启动的脚本),

也可以在用户登陆是启动,用户登录时,bash先自动执行系统管理员建立的全局登录script : 
     /ect/profile 
   然后bash在用户起始目录下按顺序查找三个特殊文件中的一个: 
     /.bash_profile、 
     /.bash_login、 
     /.profile, 
   但只执行最先找到的一个。

在项目中,采用的一种比较独特的方式:在/etc/xdg/autostart/文件路径下,新建node_upload,destop文件,文件内容如下:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Node
X-GNOME-FullName=Node Js
GenericName=Node
Comment=Update your microblog and view others' statuses
Icon=node
Exec=/home/node/nodeClient/daemon/node_upload
#OnlyShowIn=GNOME;Unity;
X-GNOME-Autostart-enadbled=true
#AutostartCondition=GSettings org.gwibber.preferences autostart
X-GNOME-Autostart-Delay=10
NoDisplay=trueName[en_US]=node_upload

注意这个地方是(2)中生成可执行文件的绝对路径。

至此,当设备开机时,就可以实现程序的自启动以及崩溃重启了。

Ubuntu下看门狗程序以及基于.destop文件实现的开机自启动相关推荐

  1. C# 简单制作一个看门狗程序

    前言 在有些特殊项目中,软件可能是无人值守的,如果程序莫名其妙挂了或者进程被干掉了等等,这时开发一个看门狗程序是非常有必要的,它就像一只打不死的小强,只要程序非正常退出,它就能立即再次将被看护的程序启 ...

  2. shell看门狗程序

    Shell 看门狗程序是一种常见的系统管理工具,其作用是在后台持续监测系统进程,如果发现某个进程出现故障或者意外停止,则会自动重新启动该进程. 通常情况下,Shell 看门狗程序会以守护进程的方式运行 ...

  3. Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

    Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...

  4. [C++]Linux之Ubuntu下编译C程序出现错误:“ stray ‘\302‘或者‘\240‘ in program”的解决方案

    [C++]Linux之Ubuntu下编译C程序出现错误:" stray '\302'或者'\240' in program"的解决方案 参考文章: (1)[C++]Linux之Ub ...

  5. Ubuntu 下编写C程序

    Ubuntu 下编写C程序 一.编写C程序 二.编译C程序 三.make工具和Makefile文件 一.编写C程序 使用VIM编辑器编写程序,也可以使用vscode. 1.1.设置vim编辑器 设置v ...

  6. 单片机看门狗c语言,单片机看门狗程序

    /*此程序实现单片机"看门狗"WDT的功能*/ #include"p18f458.h" unsignedlongi; /*系统初始化子程序*/ voidinit ...

  7. 单片机看门狗c语言,单片机看门狗程序 -解决方案-华强电子网

    *此程序实现单片机"看门狗"WDT的功能*/ #include"p18f458.h" unsignedlongi; /*系统初始化子程序*/ voidiniti ...

  8. Ubuntu下编译qt程序libQtWebEngineCore报错

    最近在Ubuntu下编译qt程序时, 报如下错误 libQt5WebEngineCore.so: .dynsym local symbol at index 3 (>= sh_info of 3 ...

  9. Ubuntu下C语言程序的编写

    Ubuntu下C语言程序的编写 要求:请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b ...

最新文章

  1. Akka的字数统计MapReduce
  2. 判断三角形是否是直角三角形
  3. aop中joinpoint_Spring AOP示例教程–方面,建议,切入点,JoinPoint,注释,XML配置...
  4. mysql php 时间比较大小_MySql中时间比较的实现
  5. [图解]创建虚拟机以及安装CentOS系统和创建自定义布局
  6. 符号回归工具之 geppy: Python中的基因表达编程框架
  7. 北京自贸区国际商务服务片区挂牌 总面积48平方公里
  8. 信息系统项目管理师复习方法学习计划
  9. 解决css样式中first-child和last-child不生效的问题
  10. 查找和排序方法归类----C和C++
  11. XShell6 循环执行脚本
  12. python笔记图片_python-opencv笔记 图像的读取和简单几何图形绘制
  13. Qt for IOS 制作APP启动页面
  14. 2k19徽章修改_您可以修改此会议徽章
  15. SCDL--稀疏编码(sparse code)与字典学习(dictionary learning)
  16. android 加固服务器,Python 脚本构建Android APK 自动加固、打渠道包并上传服务器
  17. python数据分析与爬虫区别_Python数据分析与爬虫
  18. 关于实习结束后的一些事
  19. Qt中调用thrift
  20. 百尺杆头,更进一步---和大家新年共勉!

热门文章

  1. web前端自学好还是培训好
  2. amd支持MySQL吗_AMD三核CPU处理器安装不了用友数据库吗?
  3. Android使用WallpaperService和openGL ES生成的动态图形设置动态壁纸
  4. iOS 忘记访问限制的密码后找回的方法
  5. OneNote复制为默认字体大小(只复制文字,不复制原有字体格式)
  6. 4月03日云栖精选夜读:阿里全资收购饿了么意味着啥?这篇分析说全了!
  7. 蓝牙无线运动耳机排行榜、口碑最好的运动蓝牙耳机推荐
  8. UML 用例图 use case diagram
  9. 跟炒鸡辣鸡一起学用go写游戏后端
  10. 我的大学时代.篇章三