服务停止是同步还是异步?

服务停止是同步还是异步?

sudo service ... stop之前通过 SSH 远程关闭机器,但后来我意识到我不知道是否stop同步,我想知道我是否太快关闭 Ubuntu 机器。

那么我的恐惧是否基于错误的预感?

编辑:我的服务是个人服务,它从端口接收侦听内容,然后不时将内容写入数据库。我担心如果服务突然停止,事情就没有时间被刷新。stop负责冲洗东西,但考虑到它可能需要时间......

答案1

确保您的申请

  1. 将其正确关闭记录到系统日志中,请参阅了解man 3 syslog详细信息
  2. 通过将所需的所有内容写入数据库、关闭连接和exiting 来处理 SIGTERM;man 2 sigaction详情请参阅
  3. /etc/init.d 中有一个工作停止处理程序;看到man init并且man stopping

然后您就不必猜测您的应用程序是否正确停止,您就会知道。

答案2

这取决于您的服务如何停止。只有您知道:服务启动和停止方法是您应该为服务用户记录的内容,并且最好提供。

kill如果您的服务是通过从 shell 脚本调用向其发送信号来停止的,那么这是异步的。命令kill或系统调用向进程发送信号并立即返回。没有机制可以让进程回调来通知它已经对信号进行了满意的处理。所以你需要找到另一种方法来表明你已经完成了。

许多方法都是可能的,例如让服务创建或删除文件,并让控制脚本监视对该文件的更改。然而,他们往往很尴尬。如果您在服务完成时需要反馈,那么从不相关的进程发送信号并不是一个很好的方法。

如果您的服务通过 Upstart 服务描述中的指令停止stop,Upstart 会向进程发送一个信号。然后,Upstarts 等待几秒钟,让进程停止。因为 Upstart 是进程的父进程,所以当进程退出时,它会收到来自内核的通知(SIGCLD 信号)。仅当进程不分叉以将其自身置于后台时,此方法才有效。新贵服务描述通常调用守护进程,并带有告诉它们不要分叉的选项(例如ssh -D)。

高级服务有节流命令。当您调用限制命令时,它们将停止接受新连接。当所有挂起的连接都关闭时,服务会向限制命令发送肯定答复,然后退出。通信方法通常是 Unix 或 IP 套接字。

相关内容