如何配置Linux服务,确保崩溃或重启后自动加以运行——第一部分:应用实例

linux系统命令systemctl详解,管理系统服务的工具-控制systemd、管理unit、启动或禁止服务 systemctl命令是Linux操作系统中用于管理系统服务的命令行工具,尤其在RHEL 7及更高版本上,它替代了之前的service和chkconfig命令,将两者的功能整合在一起。systemctl的主要功能包括查询或发送相应的控制命令给systemd、管理unit以及启动或禁止相应的服务等。只有在CentOS 7及以上版本中才能使用systemctl命令来管理系统和服务。 阅读详情

提供:ZStack云计算

系列教程

本教程为如何配置Linux服务,确保崩溃或重启后自动加以运行系列两篇中的第一篇。

内容简介

本教程将讲解如何配置系统服务,旨在遭遇崩溃或服务器重启后能够自动加以运行。

本示例使用MySQL,但大家也可利用同样的方式重新运行服务器上的其它服务,例如Nginx或Apache等。

本教程中我们将涵盖三种最为常见的init系统,因此请选择适用于您具体发行版的内容。(很多发行版提供多种选项,或者允许用户安装其它init系统。)

  • System V为较早的init系统:

    • Debian 6及更早版本
    • Ubuntu 9.04及更早版本
    • CentOS 5及更早版本
  • Upstart:

    • Ubuntu 9.10到Ubuntu 14.10,包括Ubuntu 14.04
    • CentOS 6
  • systemd为各最新发行版中的init系统:

    • Debian 7与Debian 8
    • Ubuntu 15.04及更新版本
    • CentOS 7

大家也可参阅本系列文章的第二篇查看相关参考资料。

背景介绍

运行中的Linux或Unix系统始终拥有大量后台进程处于执行状态。这些进程——或者可称为服务或守护程序——可能属于操作系统的原生组件,或者作为应用程序的一部分存在。

操作系统服务示例:

  • sshd守护程序,用于远程连接
  • cupsd守护程序,用于控制打印

应用程序守护程序示例:

  • httpd/apache2属于Web服务器服务
  • mongod属于数据库守护程序

这些服务需要持续运行以支持我们的网站、邮件、数据库及其它应用。

作为管理员,我们需要确保Linux服务:

  • 持续运行且不存在故障
  • 在系统重启或崩溃时能够自动运行

但有时候这些服务仍会停止,并导致网站或应用不再可用。

本文的目标在于以自动化方式重新启动并运行。

我们可以变更服务管理守护程序的处理方式确保Linux服务拥有自我修复能力,而此类守护程序正是之前所提到的init系统。

不同Linux发行版往往配备不同的服务管理守护程序,我们之前已经提到了各常见发行版所使用的默认init系统。

更多细节可参阅本系列文章的第二部分。在这部分中,我们将首先了解Linux系统中所存在的四项基本runlevel:

  • 0 - Runlevel 0代表系统停机
  • 1 - Runlevel 1代表单用户援助模式
  • 5 - Runlevel 5代表多用户、网络可用、图形模式
  • 6 - Runlevel 6代表系统重启

总体而言,runlevel 2、3与4代表着Linux处于多用户、网络启用、文本模式。

当我们将某项服务设为自动启动,即相当于将其添加到了一种runlevel当中。

目标

在本系列教程中,我们将了解如何配置一项Linux服务,从而确保其在系统重启或崩溃后能够再次自动运行。

在第一部分教程内,我们将了解如何使用三种不同的init(即初始化)模式:

  • System V init (亦被称为经典init)
  • Upstart
  • systemd

先决条件

要完成本教程,大家需要创建数个DigitalOcean Droplets(或者自己的Linux服务器),其各自需要至少1 GB内存。关于Droplet的具体创建方法,大家可以参阅此处。

我们将在示例中使用多种不同发行版。

  • Debian 6 x64(这款较早版本的OS用于演示System V init系统)
  • Ubuntu 14.04 x64 (演示Upstart)
  • CentOS 7 x64 (演示systemd)
  • 大家还需要在每台服务器上设置一个sudo用户。欲了解更多与sudo权限机制相关的信息,可参阅启用sudo访问相关教程

最后提醒大家,请不要将本教程中的任何命令、查询或者配置应用于生产服务器当中。

利用System V实现服务自动启动

首先来看System V init。

  • Debian 6及更早版本
  • Ubuntu 9.04及更早版本
  • CentOS 5及更早版本

在System V中,大家安装的大部分标准应用——例如Nginx或MySQL——都会在重启后默认自动运行,但崩溃后其无法自动运行。这些应用将在/etc/init.d文件中拥有其init脚本。

对于定制化应用,大家需要创建自己的init脚本并手动启用其自动运行机制。

本文不会介绍如何创建init脚本,但大家可以参考现有示例了解其内容设定方式。System V利用Bash实现init脚本。

System V的自动启动清单

配置清单

  • 确保/etc/init.d/service当中存在该服务的功能性Bash init脚本
  • 使用update-rc.d命令以启用该服务(在CentOS系统中,命令为chkconfig):

    • sudo update-rc.d service enable
  • 此命令会在/etc/rc2.d中创建一条symlink,如下所示(不要手动进行创建):

    lrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/service
    

请注意,我们应当看到/etc/rc3.d到/etc/rc5.d这几个目录,我们将在后续的runlevel部分对具体数字进行讲解。

  • 在/etc/inittab文件末尾为该服务添加respawn行。示例如下:

    /etc/inittab
    
    id:2345:respawn:/bin/sh /path/to/application/startup
    
  • 停止该服务,而后重新启动:

    -   sudo service service stop
    
    -   sudo service service start
    
  • 重启该服务器。

    -   sudo reboot
    

测试

要测试上述设置是否有效,大家可以:

  • 重启服务器并检查服务是否正在运行
  • 搜索进程数字:

    -   ps -ef | grep service
    
  • 关闭该进程:

    -   sudo kill -9 process_number
    
  • 等待五分钟,而后检查该服务是否正在运行。

第一步——接入Debian 6 Droplet

现在我们将利用MySQL运行实例。首先在DigitalOcean控制面板中创建一个内存为1 GB的Debian 6.0 x64 Droplet。

Droplet初始化完成后,使用SSH以接入该服务器(Windows用户可以利用PuTTY等工具实现接入)。

- ssh sammy@your_server_ip

在以下操作中,我们假定大家的账户已经拥有sudo权限。

第二步——安装MySQL

我们将利用MySQL作为测试对象。执行以下命令以安装MySQL Server:

- sudo apt-get install mysql-server -y

下图所示为新的root密码输入界面:

再输入一次密码:

按下回车以确认。

MySQL安装完成后,运行以下命令以保护安装结果:

- mysql_secure_installation

此次我们需要输入当前root密码。按下N以继续使用原有密码。而后按下Y以移除匿名用户、禁用远程root登录并移除测试数据库。最后,按下Y以重新载入权限表。

到这里安装工作就完成了。

执行以下命令以检查该服务是否正在运行:

- service mysql status

输出结果将显示为数行信息,其中一行显示了MySQL服务的运行时间:

Output

/usr/bin/mysqladmin  Ver 8.42 Distrib 5.1.73, for debian-linux-gnu on x86_64

. . .

Uptime:         4 days 18 hours 58 min 27 sec

Threads: 1  Questions: 18  Slow queries: 0  Opens: 15  Flush tables: 1  Open tables: 8  Queries per second avg: 0.0.

第三步——配置MySQL确保在重启后自动运行

在默认情况下,MySQL会在重启后自动运行。

大家可以在/etc/rc2.d目录中的MySQL init脚本内查看到这条symlink。请注意,请不要手动创建这些symlink,使用update-rc.d命令以启用及禁用这些服务。

- ls -l /etc/rc2.d

Output

lrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/mysql

只要对应的默认runlevel目录下仍有S脚本存在,则init就会在服务器启动后自动运行该服务。

现在我们需要进行验证。重启设备:

- sudo reboot

当服务器再次上线,利用SSH进行接入。

再次运行service mysql status命令,结果显示其正在运行,意味着我们的实验已经获得成功。

不过在某些情况下,我们需要手动配置部分服务才能实现自动运行。在Debian系统中,使用update-rc.d命令以添加或移除需要自动运行的服务。

下面禁用MySQL服务,而后了解如何重新启动其自动运行机制。使用以下命令禁用MySQL:

- sudo update-rc.d mysql disable

为了进行测试,再次重启服务器。

- sudo reboot

通过SSH接入服务器。

使用MySQL客户端工具接入MySQL:

- mysql -u root -p

这时获得的信息如下:

Output

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

重新启用该服务:

- sudo update-rc.d mysql enable

输出结果变为:

Output

update-rc.d: using dependency based boot sequencing

如果大家使用的是CentOS系统配合System V,则将update-rc.d命令替换为chkconfig。

请注意,启动时自动执行并不代表某项服务能够在被关闭后自行开启。要启动MySQL,请使用以下命令:

- sudo service mysql start

第四步——配置MySQL以实现崩溃后自动运行

现在我们开始考虑崩溃后的情况。在System V中,崩溃后重启并非默认选项。

我们将突然关闭进程以模拟崩溃情况。利用以下命令找到其进程ID:

- ps -ef | grep mysql

输出结果如下:

Output

root      1167     1  0 07:21 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql     1292  1167  0 07:21 pts/0    00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root      1293  1167  0 07:21 pts/0    00:00:00 logger -t mysqld -p daemon.error
root      1384  1123  0 07:21 pts/0    00:00:00 grep mysql

MySQL的主进程为mysqld_safe与mysqld。其中mysqld_safe为mysqld的父进程。

在本示例中,我们可以看到其进程ID分别为1167与1292。其进程数字以红色进行高亮显示。

下面使用kill -9命令模拟崩溃情况:

- sudo kill -9 1167
- sudo kill -9 1292

检查服务状态:

- sudo service mysql status

输出结果显示该服务已经停止:

Output

MySQL is stopped..

现在我们的服务已经崩溃。接下来考虑如何以自动方式使其重新运行——具体办法为编辑/etc/inittab文件。

我们将在第二部分教程内详尽探讨/etc/inittab文件,现在我们只需要知晓其为System V init在启动时读取的第一个文件。

事实上,/etc/inittab负责决定某一进程在崩溃后该如何反应。对于某些进程,其需要重新启动服务——MySQL自然也属于这一类。因此首先将其拷贝出来:

- sudo cp /etc/inittab /etc/inittab.orig

请注意:在编辑/etc/inittab文件时需要万分小心。如果大家在命令中出现错误或者删除了现有配置,那么系统将无法在重启后正常运行。

在文本编辑器中打开/etc/inittab:

- sudo nano /etc/inittab

在文件末尾添加以下行:

/etc/inittab

ms:2345:respawn:/bin/sh /usr/bin/mysqld_safe

其含义是,我们在/etc/inittab文件内添加了命令,旨在恢复崩溃了的mysqld_safe进程。其中包含四个字段,彼此之间以冒号分隔。

  • ms: 前两个字母负责指定目标进程的ID。
  • 2345: 第二字段负责指定其应用的runlevel。在本示例中,其runlevel为2、3、4、5。
  • respawn: 第三字段指定具体操作(即恢复该服务)。
  • /bin/sh /usr/bin/mysqld_safe: 最后,第四字段为目标进程(即命令的执行对象)。

完成后保存并退出。

再次启动该服务:

- sudo service mysql start

重启服务器以应用变更:

- sudo reboot

现在再次搜索进程ID,关闭进程,检查运行状态,等待5分钟后执行以下命令:

- sudo service mysql status

现在可以看到,MySQL已经在崩溃后自动重启。

成功了!MySQL已经能够在系统崩溃与重启这两种情况下自行恢复运转。

利用Upstart实现服务自动运行

Upstart属于另一种init方法,其最初出现在Ubuntu 6当中。目前其在Ubuntu 9.10、RHEL 6以及谷歌Chrome OS等系统中作为默认选项。

  • Ubuntu 9.10到Ubuntu 14.10, 包括Ubuntu 14.04
  • CentOS 6

Upstart在处理系统服务方面比System V表现得更好,而且也易于掌握。不过我们在这里不会深入探讨,感兴趣的朋友可以参阅Upstart使用教程。

Upstart利用配置文件实现服务控制。这些文件位于/etc/init目录,采用纯文本内容并以易于阅读的方式存在于stanzas区段之内。每条stanza负责描述服务的一个方面以及执行方式。

在默认情况下,Nginx或MySQL等标准应用都能够在重启或崩溃后自动恢复运行,因为其init脚本已经直接存在于/etc/init当中。

对于其它定制化应用,大家需要进行手动设置。要了解更多与定制Upstart脚本相关的内容,请参阅之前提到的Upstart使用教程。

Upstart的自动运行列表

配置列表

  • 确保服务在/etc/init/service.conf处拥有一个功能性Upstart init脚本

    • /etc/init/service.conf文件应当包含诸如start on runlevel [2345]的一行,从而在重启后实现自动恢复
    • /etc/init/service.conf文件应当包含respawn行以确保服务在崩溃后能够自动恢复
  • 确保此处不存在目标服务的override文件:

/etc/init/service.override

(此文件只应在我们自己或者其他管理员此前创建过时存在)

  • 停止后重新启动服务:

    -   sudo initctl stop service
    -   sudo initctl start service
    
  • 重启服务器:

    -   sudo reboot
    

测试

要测试上述设置是否有效,大家可以:

  • 重启服务器并检查服务是否正在运行
  • 搜索进程数字:

    -   ps -ef | grep service
    
  • 关闭该进程:

    -   sudo kill -9 process_number
    
  • 等待数秒并验证服务是否已经重新运行。

第一步——接入Ubuntu 14.04 Droplet

这里我们使用Ubuntu 14.04服务器,运行MySQL以演示Upstart。

利用Ubuntu 14.04 x64作为基础镜像,创建一套内存为1 GB的Droplet。

利用SSH接入该服务器:

- ssh sammy@your_server_ip

在以下操作中,我们假定大家的账户拥有sudo权限。

第二步——安装MySQL

下面安装MySQL。执行以下命令以更新软件包列表:

- sudo apt-get update

安装MySQL Server:

- sudo apt-get install mysql-server -y

为MySQL创建新的root密码并确定。

安装完成后,运行mysql_secure_installation命令:

- mysql_secure_installation

其余部分与此前Debian中的安装流程一致。

第三步——配置MySQL以实现重启后服务运行

默认情况下,MySQL会在重启后自动恢复运行。大家可以查看其配置,并将方法应用于其它服务。

首先检查MySQL进程是否正在运行:

- sudo initctl status mysql

结果如下:

Output

mysql start/running, process 2553

重启服务器:

- sudo reboot

在服务器重新上线后,使用SSH重新接入。

检查MySQL状态:

- sudo initctl status mysql

可以看到,MySQL已经自动启动。

请注意,对于其它应用守护程序,我们需要在/etc/init/目录内手动创建Upstart文件以实现自动启动。

那么,要如何告知Upstart在服务器重启后自动运行MySQL?

首先利用文本编辑器打开MySQL的Upstart init文件/etc/init/mysql.conf:

- sudo nano /etc/init/mysql.conf

Upstart文件与我们之前提到的shell脚本完全不同。

MySQL的init配置文件中将包含用于实现pre-start与post-start事件的脚本块。这些代码片段负责告知Upstart系统在mysqld进程正在启动或者已经启动时应执行哪些操作。

下面来看文件的前十行:

/etc/init/mysql.conf

...
description     "MySQL Server"
author          "Mario Limonciello <superm1@ubuntu.com>"

start on runlevel [2345]
stop on starting rc RUNLEVEL=[016]

respawn
respawn limit 2 5

可以看到,MySQL应该以runlevel 2、3、4、5启动,而非runlevel 0、1与6。

在这里我们可以对Upstart守护程序进行服务启动定义。在这里,我们直接使用服务配置文件即可。

其中respawn指令负责在崩溃后重新启动该服务,我们将在下一节中进行详细说明。

第四步——配置MySQL确保崩溃后自动启用服务

现在打开/etc/init/mysql.conf文件。

其中respawn命令的作用非常明确:MySQL会在崩溃后自动恢复。

接下来的指令则非常有趣:respawn limit指令限制了Linux尝试恢复崩溃服务的次数与尝试之间的相隔秒数。在本示例中,(2)为尝试次数,(5)为间隔秒数。如果服务无法在阈值之内顺利完成重启,则将一直处于停止状态。

现在,退出文本编辑器。

正如之前所见,默认情况下MySQL已经能够在崩溃后自动重启。

下面检查该服务的PID以进行测试:

- sudo initctl status mysql

重启后的新PID如下:

Output

mysql start/running, process 961

请注意这里的进程ID。下面利用kill -9命令将该进程关闭:

- sudo kill -9 961

再次检查MySQL状态,其应该再次运行并使用新的PID:

- sudo initctl status mysql

输出结果如下:

Output

mysql start/running, process 1552

如果大家愿意,可以多次重复上述操作:

之所以MySQL能够始终在线,是因为mysql.conf文件中的respawn命令。

/etc/init/mysql.conf

respawn

再次强调,MySQL属于默认自动恢复对象,但其它应用则需要大家修改其配置以实现同样的效果。

利用systemd实现服务自动恢复

systemd是一款Linux平台上的系统与服务管理器,且已经成为大多数新型Linux发行版的默认初始化守护程序。

  • Debian 7与Debian 8
  • Ubuntu 15.04
  • CentOS 7

systemd能够向下兼容System V命令与初始化脚本。

利用systemd,大多数安装的标准应用都能够在重启及崩溃后自动实现恢复。这些应用在/etc/systemd/system 当中拥有自己的init脚本。

对于定制化应用,大家需要创建自己的init脚本并借此实现服务恢复。关于这部分内容,请参阅systemd教程。

systemd的自动启动列表

配置列表

  • 确保该服务在/etc/systemd/system/multi-user.target.wants/service.service当中拥有一条功能性systemd init脚本。
  • 使用systemctl命令以启动该服务:

    -   sudo systemctl enable service.service
    
  • 以上命令会创建一条指向/etc/systemd/system/multi-user.target.wants/的symlink,内容如下:

    lrwxrwxrwx 1 root root 38 Aug  1 04:43 /etc/systemd/system/multi-user.target.wants/service.service -> /usr/lib/systemd/system/service.service
    

意味着服务将在重启后自动恢复。

  • /etc/systemd/system/multi-user.target.wants/service.service文件中应当包含Restart=always行,其位于[Service]区段之下,负责在崩溃后重新恢复服务:
  • 加载systemd守护程序,而后重启该服务:

    -   sudo systemctl daemon-reload
    
    -   sudo systemctl restart service.service
    

测试

下面测试实际效果:

  • 重启服务器后检查服务是否正在运行:

    -   sudo reboot
    
  • 搜索其进程号:

    -   ps -ef | grep service
    
  • 关闭该进程:

    -   sudo kill -9 process_number
    
  • 数秒之后,服务即可重新上线。

第一步——接入CentOS 7 Droplet

在本示例中,我们使用CentOS 7与MySQL以说明如何配置systemd服务。

首先创建一个1 GB内存的Droplet,并选择CentOS 7 x64作为其基础镜像。

使用SSH接入该服务器。

- ssh sammy@your_server_ip

这里我们假设大家的账户拥有sudo权限。

第二步——安装MySQL

运行以下命令以下载并安装MySQL Community server repo:

- sudo wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

- sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

安装MySQL server:

- sudo yum install mysql-server -y

安装完成后,启动mysqld服务。

(请注意,在Debian与Ubuntu中的MySQL安装流程有所区别。在Debian中,安装完成后MySQL会自动启动。)

另外,我们使用systemctl命令来控制该服务:

- sudo systemctl start mysqld

接下来运行mysql_secure_installation命令。

- mysql_secure_installation

在这里MySQL root密码为空,大家可以根据需要创建一条新密码。其余流程部分与之前提到的Debian或Ubuntu一致。

第三步——配置MySQL以实现重启后自动恢复

默认情况下,MySQL会在重启后自动恢复运行。为了了解其实现原理,我们首先检查mysqld守护程序的具体配置。执行以下命令:

- sudo systemctl is-enabled mysqld.service

结果如下:

Output

enabled

重启设备:

- sudo reboot

服务器重新上线后,利用SSH进行接入。

执行以下命令检查服务状态:

- sudo systemctl status mysqld.service

输出结果如下:

Output

mysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1min 52s ago
Process: 662 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
Process: 625 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 661 (mysqld_safe)
...

运行以下命令禁用该服务:

- sudo systemctl disable mysqld.service

这时服务并不会停止,但会被禁用。从输出结果中可以看到,symlink已经被删除了:

Output

rm '/etc/systemd/system/multi-user.target.wants/mysqld.service'
rm '/etc/systemd/system/mysql.service'

大家也可以重复以上过程,查看MySQL server是否会恢复运行。

或者再次执行systemctl is-enabled,结果如下:

- sudo systemctl is-enabled mysqld.service

Output

disabled

再次启用该服务:

- sudo systemctl enable mysqld.service

输出结果显示,symlink已经再次启用:

Output

ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/mysql.service'
ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/multi-user.target.wants/mysqld.service'

这意味着服务器重启后,服务将能够自动恢复。

第四步——配置MySQL确保崩溃后服务自动恢复

现在看看如何配置MySQL以确保崩溃后自动恢复。

首先打开mysqld.service unit文件(请记住,systemd服务使用unit文件以实现配置):

- sudo nano /etc/systemd/system/multi-user.target.wants/mysqld.service

在文件末尾可以看到一条重启指令:

/etc/systemd/system/multi-user.target.wants/mysqld.service

[Unit]
...

[Install]
...

[Service]
...
...
Restart=always
...

这里Restart参数被设定为always,意味着MySQL服务将在完全或不完全退出或者超时后始终自动重启。

这就是systemd中的自动重启定义方式。

与Upstart中的respawn指令类似,Restart参数负责定义服务在崩溃后执行何种操作。

并非所有systemd服务都在默认条件下启用自动恢复,不过大家可以在对应服务的unit文件内[Service]区段下添加额外指令以实现这一效果。

为了模拟崩溃情况,我们退出编辑器并检查MySQL进程ID:

- sudo systemctl status mysqld.service

Output

mysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1h 7min ago
Main PID: 661 (mysqld_safe)
...

在本示例中,主PID为661,大家需要将其替换为自己的实际PID:

- sudo kill -9 661

检查服务状态:

- sudo systemctl status mysqld.service

输出结果如下:

Output

mysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
Active: active (running) since Fri 2015-07-31 23:06:38 EDT; 1min 8s ago
Process: 11218 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
Process: 11207 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 11217 (mysqld_safe)
...
...

可以看到,服务能够在崩溃后自动实现恢复。

总结

在本教程的第一部分中,我们了解了System V、Upstart与systemd服务如何在重启或崩溃后实现服务自动恢复。

我们也了解了各文件、配置参数与命令如何控制对应操作。

在本部分内,我们只探讨操作方式。在第二部分文章中,我们将进一步探讨更多概念与基础信息。

请暂时不要删除Droplet——保持运行,因为我们还将在下一部分文章中继续使用。

本文来源自DigitalOcean Community。英文原文:How To Configure a Linux Service to Start Automatically After a Crash or Reboot – Part 1: Practical Examples By Sadequl Hussain

翻译:diradw

Linux 系统异常触发后自动重启配置指南 适用于内核崩溃(Kernel Panic)、硬件驱动故障等场景,通过 SysRq 和 Watchdog 实现快速恢复。通过上述配置,可覆盖内核崩溃、服务异常、网络中断等多种场景下的自动重启需求,平衡系统稳定性与恢复效率。适用于用户态服务崩溃、进程挂起等场景。适用于网络链路中断导致服务不可用。)后自动重启,便于后续调试。用于生成崩溃转储文件( 阅读详情

相关推荐

如何配置 Linux 服务在崩溃或重启后自动启动 – 第二部分:参考(1)

为了做好运维面试路上的助攻手,特整理了上百道,让你面试不慌心不跳,高薪offer怀里抱!这次整理的面试题,本份面试集锦涵盖了1、什么是运维?2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?3、现在给你三百台服务器,你怎么对他们进行管理?4、简述raid0 raid1raid5二种工作模式的工作原理及特点5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

2401_84140428的博客 1147

【systemd】如何设置systemd服务自动重启

设置systemd服务自动重启的方法

pcj_888的博客 3465

如何通过 systemd 确保服务自动重启:以 java-test 服务为例

systemd是 Linux 系统中负责启动和管理系统服务的守护进程,它也是目前大多数 Linux 发行版默认的初始化系统。systemd除了管理系统启动流程之外,还具有强大的服务管理功能,比如支持服务自动重启、依赖管理、日志记录等。:启动指定服务。:停止指定服务。:重启指定服务。:查看服务状态。:设置服务开机自启动。:取消服务开机自启动。通过systemd的强大服务管理功能,我们可以轻松地为 Linux 系统中的服务配置自动重启机制。本文以java-test。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

linux 配置service 命令开机启动

现在,当计算机启动时,systemd将自动运行配置的命令。linux 配置service 命令开机启动。

太上舞殇的博客 2001

如何在崩溃或重启后保持 Linux 进程运行

除了使用现有的工具外,您还可以编写自定义脚本来处理进程在崩溃或系统重启后的恢复。编写脚本以捕捉系统发送的信号,例如SIGTERM和SIGINT。这样可以在进程终止之前执行清理操作,确保进程状态得到保存。将进程的关键状态保存到文件中。在启动时,检查这些文件并恢复进程的状态,从而在崩溃或系统重启后能够恢复正常运行。这种方法需要更多的编程工作,但为您提供了更多的灵活性和控制权。

网络技术联盟站 768

restart_on_crash进程监控,自动重启进程

进程监控,自动重启进程

理解Systemd服务重启策略:on-failure vs always

本文描述了Systemd的Restart=o-failure以及Restart=always策略的区别

bxstephen的专栏 1万+

一个三极管和稳压管构成的简易稳压电源

一、对电压精度要求不高的场所可以使用本文中所述的简易稳压电源(电流变化引起 的基极-发射极的压降 变化 对输出电压来说可以容忍)二、根据负载实际需求选择三极管,不同的三极管集电极电流不同,电流放大倍数不同(1、尽量选择负载电流(iC 或 iE)上限时,hFE仍然比较理想的三极管,2、一般三极管对基极电流没有限制,可以适当调整基极电流以获得所需输出电流)

五花带点肉 1万+

如何配置 Linux 服务在崩溃或重启后自动启动 – 第一部分:实际示例

在这个两部分的教程中,你将学习如何使用systemd配置 Linux 服务,在重启或崩溃后自动重启。第一部分涵盖了一般的 Linux 服务管理概念,比如init守护进程和运行级别。它以systemd中的服务管理演示结束。在这里,你将研究targetswantsrequires和unit文件。第二部分提供了一个逐步完成实际和常见systemd任务的教程。具体来说,你将配置一个 MySQL 数据库服务器,在崩溃或重启后自动启动。Linux 服务可以通过改变它们被服务管理守护进程(也称为init。

rubys007的博客 2803

手把手教你使用HFSS仿真高速差分过孔—上

高速数字电路设计中,信号完整性是一个非常重要的问题。为了使信号保持良好的传输特性,PCB板上的互联线一般都采用均匀传输线,使互联线保持特性阻抗一致性,减少信号反射。然而PCB板上的互联线很多时候避免不了换层的问题,这时候就必须使用过孔。过孔会导致阻抗不连续,进而造成反射,出现信号完整性问题。         当信号传输速率越高,信号前沿越短的时候,过孔引入的信号完整性问题越严重,需要对过孔进行优

a2447944219的博客 2万+

利用Virtuoso IC 618进行LDO稳定性分析与补偿设计

本文详细介绍了如何利用Virtuoso IC 618进行LDO稳定性分析与补偿设计。通过搭建仿真环境、运行STB分析诊断环路问题,并深入探讨密勒补偿、调零电阻等关键技术,帮助工程师在Virtuoso平台中高效完成LDO的稳定性优化与验证,确保芯片在各种工艺角下的鲁棒性。

weixin_29170327的博客 165

如何配置 Linux 服务在崩溃或重启后自动启动 – 第二部分:参考

在本教程中,您将使用systemd配置 MySQL,在重启或崩溃后自动重新启动。这是一个两部分系列的第二部分。第一部分涵盖了一般的 Linux 服务管理概念,如init守护进程和运行级别。它以systemd中的服务管理演示结束。在这里,您将研究targetswantsrequires和unit文件。第二部分提供了使用 MySQL 数据库的实际示例。

rubys007的博客 2051

使用Android GPS api 实现一个轨迹记录的小功能

引入 市场上的跑步软件已经是非常多了,如咕咚和悦跑圈还有其他,很多大厂也在涉足这个方面。而最简单的运动跑步,最近几年也因简单,不限场地,运动效果出众备受大众喜欢。 我的这篇文章的内容很多也是从网上学习其他的博客内容,外加利用android自身的提供的api实现的,希望能对有这方面需求的朋友有所帮助。 介绍 先上两张图,界面比较丑,不过一些数据基本都有了,这个图片是临时要用截取的,所以轨迹线很短,之前

尝试着去了解代码 1万+

Linux之systemd服务配置及自动重启

systemctl 创建服务的方法

ZONGXP的博客 4万+

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 707

C++之2048小游戏 第二期

游戏会有初始化、绘制界面、处理输入、更新游戏状态、判断胜负等部分。所以,可能需要一个二维数组来表示4x4的网格,存储每个格子的数值。然后,需要处理键盘输入,尤其是方向键的控制,这可能需要使用EasyX的键盘事件处理函数。然后,关于图形绘制部分,每个格子的大小、颜色、数字的显示都需要设计。不同的数字对应不同的颜色,比如2是浅色,4稍深,以此类推。可能需要一个函数根据数字的值返回对应的颜色,然后在绘制时调用。接下来,处理数字的移动和合并逻辑。这是比较复杂的部分。

Lucky_Glory的博客 805

linux内核报错自动重启_内核崩溃后如何使Linux自动重启?

linux内核报错自动重启After a kernel panic, it is impossible to remotely connect to the Linux server to reboot it by SSH. How to make the panic kernel automatically reboot itself? 内核崩溃后,无法通过SSH远程连接到Linux服务器以重新...

cuma2369的博客 3557

SAP Joule 在顾问与开发者场景的双擎定位:Joule for Consultants 与 Joule for Developers 全面解读

SAP推出企业级AI助手Joule,分为顾问版(Joule for Consultants)和开发者版(Joule for Developers)两个版本。顾问版聚焦咨询业务,整合SAP知识库和方法论,辅助方案设计、差距分析和实施落地;开发者版嵌入开发工具链,支持代码生成、解释、测试和迁移。两者共享智能底座但面向不同场景:顾问版优化项目交付流程,开发者版提升工程效率。典型案例显示,Joule能有效缩短云转型周期,实现从业务咨询到技术落地的无缝衔接。该产品通过AI代理和知识图谱技术,为企业数字化转型提供端到端

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 358

如何配置Linux的服务设置为自动启动或崩溃重新启动后

介绍 在本教程中,自动启动 Linux 服务,我们将退后一步,更详细地解释 init 进程。你应该很好地了解它们如何控制守护进程的启动行为。 在第一部分本系列教程我们分享使用 MySQL 的如何崩溃或重启后启用的 Linux 服务自动启动一些实际的例子。 我们看到了如何从三个不同的初始化方式做到这一点:System V 的,Upstart,和 systemd。阅读第一个教程在其...

aecuhty88306453的博客 1881

【ESP 保姆级教程】玩转emqx数据集成篇④ ——数据桥接之HTTP服务

主要是学习数据桥接功能以及构建自己的http服务器,这是一个非常有用的功能。包括各种传感器上报基本上都需要数据桥接功能支持,所以还是希望认真学习这一块开发,然后结合数据库存储等等知识点进行进一步学习。

单片机菜鸟哥的博客 1307

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Linux】Shell 脚本监控服务运行状态 自动重启

Shell 脚本监控服务运行状态与自动重启方案 本文介绍三种Shell脚本方案监控Java服务运行状态并实现自动重启: 基础方案:通过ps和grep检测进程是否存在,但可能误判进程状态 端口检测方案:使用lsof检查服务端口是否监听,适合Web服务 健康检查方案:通过curl测试健康接口(如/actuator/health),最精准可靠 文章还提供了: 完整的Shell脚本示例 Java项目中启用Actuator的方法 通过crontab设置定时监控 防止无限重启的冷却机制 可视化流程图展示监控逻辑 这套方

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux进程挂掉 自动启动,配置systemd以在Linux崩溃后自动启动服务

本文介绍配置systemd以在Linux崩溃后自动启动服务的方法。进程在Linux系统上崩溃的原因有很多,你可以调查并解决问题,但可能需要一段时间。但是你可以立即将服务恢复到联机状态的一件事是在服务中断时自动启动,这会减少停机时间以获得更好的可用性,它确保你的服务始终可供用户访问。在systemd系统上自动执行此操作非常容易,因为systemd具有启用此功能的选项。可以先参考Bash脚本:实现在L...

weixin_27889245的博客 4378

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

如何配置一项在崩溃或重启后自动启用的Linux服务——第二部分:参考

提供:ZStack云计算 系列教程本教程为如何配置一项在崩溃或重启后自动启用的Linux服务系列两篇中的第二篇。内容介绍在本文中,我们将更为具体地解释上篇教程中提到的各init进程,帮助大家更好地理解其如何控制守护程序的start-up行为。在第一部分中,我们探讨了如何利用MySQL在崩溃或重启情况下实现Linux服务的自动启用。在前篇文章内,我们谈到三种不同的init模式,即System V、Up

zstack_org的博客 4081
上一篇: 如何使用JMeter记录测试场景
下一篇: ZStack Community 1.10版本正式发布
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值