歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用Linux守護進程檢測某個程序是否運行

用Linux守護進程檢測某個程序是否運行

日期:2017/3/1 10:27:01   编辑:Linux編程

環境:

主機:Fedora12

目標板:SC6410

目標板LINUX內核版本:2.6.36

實現功能:

做的一個嵌入式板子開機會自啟動一個程序,但發現它工作數天後會退出。檢查內存使用並沒有洩漏,於是編寫了一個守護進程來不斷檢查程序是否運行,沒運行則運行它,這是一個折衷的辦法。

說明:

需要運行的程序是AlarmInterface,位於目錄/rf/下面。我做了一個腳本DuiJiang來啟動這個AlarmInterface,並在腳本中添加了觸摸屏支持。也就是說啟動DuiJiang就可以啟動AlarmInterface。檢測程序是否運行的方法是通過ps -w|grep AlarmInterface指令獲得AlarmInterface的進程,然後保存在一個文件中.檢查AlarmInterface進程是否運行即可判斷程序是否運行.

驅動源代碼:

daemon_service.c:

  1. //守護進程,守護AlarmInterface進程
  2. //作者:jdh
  3. //www.linuxidc.com
  4. //時間:2012-2-27
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. #include <syslog.h>
  11. //程序名字
  12. #define NAME "AlarmInterface -qws"
  13. //查找進程中程序名字
  14. #define NAME_FIND "AlarmInterface"
  15. //輸出目錄
  16. #define DIR_OUT_FILE "/rf/out"
  17. //要運行的程序
  18. #define RUN_NAME "DuiJiang &"
  19. //#define DIR_OUT_FILE "/rf/out"
  20. //#define NAME "gnome-keyring"
  21. //#define NAME_FIND "gnome"
  22. //#define DIR_OUT_FILE "/root/test/out"
  23. int daemon(int nochdir,int noclose)
  24. {
  25. pid_t pid;
  26. //讓init進程成為新產生進程的父進程
  27. pid = fork();
  28. //如果創建進程失敗
  29. if (pid < 0)
  30. {
  31. perror("fork");
  32. return -1;
  33. }
  34. //父進程退出運行
  35. if (pid != 0)
  36. {
  37. exit(0);
  38. }
  39. //創建新的會話
  40. pid = setsid();
  41. if (pid < -1)
  42. {
  43. perror("set sid");
  44. return -1;
  45. }
  46. //更改當前工作目錄,將工作目錄修改成根目錄
  47. if (!nochdir)
  48. {
  49. chdir("/");
  50. }
  51. //關閉文件描述符,並重定向標准輸入,輸出合錯誤輸出
  52. //將標准輸入輸出重定向到空設備
  53. if (!noclose)
  54. {
  55. int fd;
  56. fd = open("/dev/null",O_RDWR,0);
  57. if (fd != -1)
  58. {
  59. dup2(fd,STDIN_FILENO);
  60. dup2(fd,STDOUT_FILENO);
  61. dup2(fd,STDERR_FILENO);
  62. if (fd > 2)
  63. {
  64. close(fd);
  65. }
  66. }
  67. }
  68. //設置守護進程的文件權限創建掩碼
  69. umask(0027);
  70. return 0;
  71. }
  72. //是否有匹配的字符,有則返回1,沒有返回0
  73. //src:源字符串
  74. //dst:目標字符串
  75. //len:源字符串被比較的長度
  76. int match(char *src,char *dst,int len)
  77. {
  78. int i = 0;
  79. int j = 0;
  80. int size_dst = 0;
  81. //獲得目標字符串的長度
  82. size_dst = strlen(dst);
  83. //如果目標字符串的長度大於len,返回失敗
  84. if (size_dst > len)
  85. {
  86. return 0;
  87. }
  88. //開始比較
  89. for (i = 0;i < len;i++)
  90. {
  91. for (j = 0;j < size_dst;j++)
  92. {
  93. if (src[i + j] != dst[j])
  94. {
  95. break;
  96. }
  97. }
  98. if (j == size_dst)
  99. {
  100. return 1;
  101. }
  102. }
  103. return 0;
  104. }
  105. int main(int argc,char *argv[])
  106. {
  107. int fd = 0;
  108. char buf[100];
  109. //開啟守護進程
  110. daemon(0,0);
  111. while (1)
  112. {
  113. //打開日志
  114. openlog(argv[0],LOG_CONS|LOG_PID,LOG_USER);
  115. //查看程序是否運行
  116. //新建輸出文件
  117. system("touch "DIR_OUT_FILE);
  118. //獲得程序ID
  119. system("ps -w|grep "NAME_FIND" >> "DIR_OUT_FILE);
  120. //打開輸出文件
  121. fd = open(DIR_OUT_FILE,O_CREAT|O_RDONLY,0777);
  122. //清空緩存
  123. memset(buf,0,100);
  124. //讀取全部
  125. read(fd,buf,100);
  126. //判斷是否有程序文件運行
  127. if (match(buf,NAME,90))
  128. {
  129. syslog(LOG_INFO,"jdh success!!!!!!!!!!");
  130. }
  131. else
  132. {
  133. syslog(LOG_INFO,"jdh fail!!!!!!!!!!");
  134. //運行程序
  135. system(RUN_NAME);
  136. }
  137. //休眠
  138. sleep(5);
  139. //刪除輸出文件
  140. system("rm "DIR_OUT_FILE);
  141. //休眠
  142. sleep(55);
  143. }
  144. //關閉日志
  145. closelog();
  146. return 0;
  147. }

守護進程每分鐘檢測一次,用tail -f /var/log/messages可以看到守護進程輸出的信息。

Copyright © Linux教程網 All Rights Reserved