免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4975 | 回复: 11
打印 上一主题 下一主题

如果在关机前保存数据? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-30 11:56 |只看该作者 |倒序浏览
假设自己写一个服务程序,开机后自动运行,是一个后台服务程序。
如果其它用户通过其它命令(比如root用户输入reboot命令)或其它程序要关闭计算机,我的程序会收到SIGTERM信号,但捕捉不到SIGKILL信号,收到SIGTERM信号后如何开始保存自己的数据到磁盘上呢?

我的测试代码如下:


  1. /************然后我来专门处理关机时收到的信号15**********************/
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>

  6. void sighandler(int);

  7. int main(int argc, char ** argv)
  8. {
  9.   int x = 0;
  10.   signal(SIGTERM, sighandler);
  11.   signal(SIGQUIT, sighandler);
  12.   while(1) {
  13.     /*printf("now %d\n", x++);*/
  14.     usleep(100);
  15.   }
  16. }

  17. void sighandler(int sig)
  18. {
  19.     FILE * fp;
  20.     int x = 0;
  21.     fp = fopen("haltsignal.txt", "a+");
  22.     if(!fp)    return;
  23.     fprintf(fp, "signal.%d received, now begin to save data:\n", sig);
  24.     for(x = 1; x <= 5; x++)    {fprintf(fp, "save data.%d\n", x); fflush(fp);}
  25.     fclose(fp);
  26. }

复制代码


当这个程序运行起来,在另一个终端输入reboot命令,然后再看haltsignal.txt却没有内容。

论坛徽章:
0
2 [报告]
发表于 2006-09-01 13:58 |只看该作者
SIGQUIT 是当键盘要求停止执行时,CTRL+\,则会产生此信号。 执行reboot是否产生此信号就不知道了。

论坛徽章:
0
3 [报告]
发表于 2006-09-01 14:52 |只看该作者
你的程序收不到这个信号, 自然不可能有所反映了
写一个服务, 关机时给你的程序发个信号.

论坛徽章:
0
4 [报告]
发表于 2006-09-02 03:00 |只看该作者
原帖由 blue_stone 于 2006-9-1 14:52 发表
你的程序收不到这个信号, 自然不可能有所反映了
写一个服务, 关机时给你的程序发个信号.

一般发行版都有在关机指令前先kill -1 的动作,所以这个程序应该是可以收到SIGTERM信号的

论坛徽章:
0
5 [报告]
发表于 2006-09-02 06:06 |只看该作者
用 syslog 在 signal handle 里记录,重启后看记录文件确定是否调用过。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2006-09-02 08:29 |只看该作者
不知道你用的是什么发行版,
我觉得最稳妥的方法不是加什么 SIGTERM,
而是在 /etc/rc3.d/ 里面加 K??* 脚本,
K 打头的脚本在重启或者是关机的时候,会被 /etc/rc.d/rc 脚本自动调用。
这样你就有机会保存你的数据。

论坛徽章:
0
7 [报告]
发表于 2006-09-02 09:35 |只看该作者
在 /etc/rc0.d 和 /etc/rc6.d 中放 S 开头的脚本比较好。

如无意外:
/etc/rc0.d 包含关机脚本
/etc/rc6.d 包含重启脚本
S:启用

[ 本帖最后由 x2 于 2006-9-2 09:38 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2006-09-02 09:39 |只看该作者
原帖由 x2 于 2006-9-2 09:35 发表
在 /etc/rc0.d 和 /etc/rc6.d 中放 S 开头的脚本比较好。

如无意外:
/etc/rc0.d 包含关机脚本
/etc/rc6.d 包含重启脚本

按照 SysV 的设计思路和规范,是应该加 K* 脚本而不是 S* 脚本。

论坛徽章:
0
9 [报告]
发表于 2006-09-04 12:52 |只看该作者
感谢x2 和 flw 的提示,本人已经试验成功!

论坛徽章:
0
10 [报告]
发表于 2006-09-04 13:00 |只看该作者
首先,各位查看一下自己的/etc/inittab看看这:

# The default runlevel.
id:2:initdefault:

当然,大家知道这是当前运行级别。比如我这里是运行级别为2

然后,编写这样一个测试脚本/etc/init.d/my-start-stop,内容如下:

  1. #! /bin/sh
  2. set -e

  3. # /etc/init.d/my-start-stop: start and stop test

  4. case "$1" in
  5.   start)
  6.         echo -n "Starting my-start-stop server"
  7.         echo ""
  8.         sleep 10
  9.         ;;
  10.   stop)
  11.         echo -n "Stopping my-start-stop server"
  12.         echo -n ""
  13.         sleep 10
  14.         ;;
  15.   *)
  16.         echo "Usage: /etc/init.d/my-start-stop {start|stop}"
  17.         exit 1
  18. esac

  19. exit 0
复制代码

然后在当前运行级别所属目录/etc/rc2.d里面创建启动链接:
ln -s /etc/init.d/my-start-stop /etc/rc2.d/S70my-start-stop

在/etc/rc0.d目录里面创建关闭链接:
ln -s /etc/init.d/my-start-stop /etc/rc0.d/K11my-start-stop


输入halt -p命令关机看看吧,肯定能看到屏幕提示:
“Stopping my-start-stop server”
然后等待10秒钟。

再开机肯定会看到屏幕提示:
“Starting my-start-stop server”

如果大家感兴趣可以看一下我之前发的贴“Linux下XWindow系统启动脚本分析”
http://bbs.chinaunix.net/viewthread.php?tid=721285&highlight=zhoulifa
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP