如果在关机前保存数据?

发布于 2022-07-24 17:48:05 字数 1410 浏览 29 评论 9

假设自己写一个服务程序,开机后自动运行,是一个后台服务程序。
如果其它用户通过其它命令(比如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 %dn", 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.%dn", x); fflush(fp);}
  25.     fclose(fp);
  26. }

复制代码

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

白日梦 2022-07-27 00:22:24

感谢x2 和 flw 的提示,本人已经试验成功!

泼猴你往哪里跑 2022-07-27 00:22:24

首先,各位查看一下自己的/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

日久见人心 2022-07-27 00:04:41

原帖由 x2 于 2006-9-2 09:35 发表
在 /etc/rc0.d 和 /etc/rc6.d 中放 S 开头的脚本比较好。

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

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

¢好甜 2022-07-26 22:36:25

在 /etc/rc0.d 和 /etc/rc6.d 中放 S 开头的脚本比较好。

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

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

粉红×色少女 2022-07-26 22:20:45

不知道你用的是什么发行版,
我觉得最稳妥的方法不是加什么 SIGTERM,
而是在 /etc/rc3.d/ 里面加 K??* 脚本,
K 打头的脚本在重启或者是关机的时候,会被 /etc/rc.d/rc 脚本自动调用。
这样你就有机会保存你的数据。

深爱成瘾 2022-07-26 15:47:55

用 syslog 在 signal handle 里记录,重启后看记录文件确定是否调用过。

梦途 2022-07-26 10:23:50

原帖由 blue_stone 于 2006-9-1 14:52 发表
你的程序收不到这个信号, 自然不可能有所反映了
写一个服务, 关机时给你的程序发个信号.

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

乖乖兔^ω^ 2022-07-26 05:20:29

你的程序收不到这个信号, 自然不可能有所反映了
写一个服务, 关机时给你的程序发个信号.

腹黑女流氓 2022-07-25 08:50:53

SIGQUIT 是当键盘要求停止执行时,CTRL+,则会产生此信号。 执行reboot是否产生此信号就不知道了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文