rc.local 方式

一、&

在 Linux 命令后加上 &  可以在后台运行

二、nohup

对 SIGHUP 信号免疫,对 SIGINT 信号不免疫,可用 shopt | grep hup 查看。

当关闭终端时,shell 默认会发送 SIGHUP 信号给与该终端关联的进程,从而导致其进程跟随终端退出。nohup 捕获了 SIGHUP,并做了忽略处理,因此进程不会退出。

在 Linux 命令前加上 nohup 命令可以在退出帐户/关闭终端之后继续运行相应的进程。默认会将进程的所有输出都重定向到一个名为 nohup.out 的文件中。

与上面结合起来:nohup COMMAND &,这样就能使命令永久的在后台执行了。

三、rc.local

/etc/rc.d/rc.local 此文件是为了兼容性目的而添加的,建议创建自己的 systemd 服务或 udev 规则,在引导期间运行脚本不是使用此文件。

# 给权限后,文件中的命令才能在系统启动后执行
chmod +x /etc/rc.d/rc.local

Systemd 方式

Systemd 简介:https://fedoraproject.org/wiki/Systemd/zh-cn

管理自启动服务(空格取消选中,按 TAB 切换确定):ntsysv

一、service unit 常用命令,以 mysql 服务为例

# 开机启动
systemctl enable mysqld # 关闭开机启动
systemctl disable mysqld # 启动服务
systemctl start mysqld # 停止服务
systemctl stop mysqld # 重启服务
systemctl restart mysqld # 查看服务状态
systemctl status mysqld
systemctl is-active sshd.service # 结束服务进程(服务无法停止时)
systemctl kill mysqld

二、服务启动的配置文件

配置文件主要放在 /usr/lib/systemd/system 目录,也可能在 /etc/systemd/system 目录

# 查看 sshd 服务启动文件
systemctl cat sshd.service # /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service [Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s [Install]
WantedBy=multi-user.target

每个服务文件以 .service 结尾,一般会分为 3 部分,必须包含 [Service] 部分

[Unit] 启动顺序与依赖关系

Description:当前服务的简单描述
Documentation:指定 man 文档位置 After:如果 network.target 或 sshd-keygen.service 需要启动,那么 sshd.service 应该在它们之后启动
Before:定义 sshd 应该在哪些服务之前启动
注意:After 和 Before 字段只涉及启动顺序,不涉及依赖关系。 Wants:表示 sshd.service 与 sshd-keygen.service 之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响 sshd.service 继续执行
Requires:表示"强依赖"关系,即如果该服务启动失败或异常退出,那么sshd.service 也必须退出
注意:Wants 字段与 Requires 字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动。

[Service] 启动行为

EnvironmentFile:许多软件都有自己的环境参数文件,该字段指定文件路径
注意:/etc/profile 或者 /etc/profile.d/ 这些文件中配置的环境变量仅对通过 pam 登录的用户生效,而 systemd 是不读这些配置的。
systemd 是所有进程的父进程或祖先进程,它的环境变量会被所有的子进程所继承,如果需要给 systemd 配置默认参数可以在 /etc/systemd/system.conf 和 /etc/systemd/user.conf 中设置。
加载优先级 system.conf 最低,可能会被其他的覆盖。 Type:定义启动类型。可设置:simple,exec,forking,oneshot,dbus,notify,idle
simple(设置了 ExecStart= 但未设置 BusName= 时的默认值):ExecStart 字段启动的进程为该服务的主进程
forking:ExecStart 字段的命令将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程 ExecStart:定义启动进程时执行的命令
上面的例子中,启动 sshd 执行的命令是 /usr/sbin/sshd -D $OPTIONS,其中的变量 $OPTIONS 就来自 EnvironmentFile 字段指定的环境参数文件。类似的,还有如下字段:
ExecReload:重启服务时执行的命令
ExecStop:停止服务时执行的命令
ExecStartPre:启动服务之前执行的命令
ExecStartPost:启动服务之后执行的命令
ExecStopPost:停止服务之后执行的命令 RemainAfterExit:设为yes,表示进程退出以后,服务仍然保持执行 KillMode:定义 Systemd 如何停止服务,可以设置的值如下:
control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
process:只杀主进程
mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none:没有进程会被杀掉,只是执行服务的 stop 命令 Restart:定义了退出后,Systemd 的重启方式。可以设置的值如下:
no(默认值):退出后不会重启
on-success:只有正常退出时(退出状态码为0),才会重启
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启 RestartSec:表示 Systemd 重启服务之前,需要等待的秒数

配置中多个相同配置会选择最后一个,下面结果是 execstart2

[Service]

ExecStart=/bin/echo execstart1

ExecStart=/bin/echo execstart2

所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行

EnvironmentFile=-/etc/sysconfig/sshd,表示即使 /etc/sysconfig/sshd 文件不存在,也不会抛出错误

[Install]

WantedBy:表示该服务所在的 Target(服务组)

关于 Target,运行级别

# 查看默认 Target
systemctl get-default
# 结果为 multi-user.target,表示默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么 systemctl enable 命令能设置开机启动的原因


# 查看 multi-user.target 包含的所有服务
systemctl list-dependencies multi-user.target # 切换到另一个 target
# shutdown.target 就是关机状态
# 常用的 Target 有两个:一个是 multi-user.target,表示多用户命令行状态;另一个是 graphical.target,表示图形用户状态,它依赖于 multi-user.target
systemctl isolate shutdown.target

三、自定义服务

在 /usr/lib/systemd/system 下新建服务脚本

vim /usr/lib/systemd/system/zdy.service

[Unit]
Description=描述
Environment=环境变量或参数(系统环境变量此时无法使用)
After=network.target [Service]
Type=forking
EnvironmentFile=所需环境变量文件或参数文件
ExecStart=启动命令(需指定全路径)
ExecStop=停止命令(需指定全路径)
User=以什么用户执行命令 [Install]
WantedBy=multi-user.target

新建完成后设置自启动

# 添加或修改配置文件后,需要重新加载
systemctl daemon-reload # 设置自启动,实质就是在 /etc/systemd/system/multi-user.target.wants/ 添加服务文件的链接
systemctl enable zdy

https://www.freedesktop.org/software/systemd/man/systemd.service.html & http://www.jinbuguo.com/systemd/systemd.service.html

https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

https://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

Linux 添加开机自启动的更多相关文章

  1. linux添加开机自启动脚本示例详解

    linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加如果不想将脚本粘来粘去,或创建链接什么的,则:step1. 先修改好脚本,使其所有 ...

  2. linux 添加开机自启动脚本

    原文 Linux设置服务开机自动启动的方式有好多种,这里介绍一下通过chkconfig命令添加脚本为开机自动启动的方法. 1. 编写脚本autostart.sh(这里以开机启动redis服务为例),脚 ...

  3. linux实现开机自启动脚本

    Linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加如果不想将脚本粘来粘去,或创建链接什么的,则:step1. 先修改好脚本,使其所有 ...

  4. 红帽linux系统开机自启动脚本。

    其实很多东西在最后完成以后会觉得也就那样,有意思的是探究的过程. 前段时间老板要求把一个程序做成linux系统开机自启动脚本的模式. 首先你需要写一个脚本. 我这边建立了一个.sh的脚本,就是用脚本启 ...

  5. win8系统添加开机自启动软件的方法(转)

    win8系统添加开机自启动软件的方法,把需要设置开机自启动的软件的快捷方式复制到下面任意路径就ok了.开机自启动路径如下:C:\ProgramData\Microsoft\Windows\Start ...

  6. 为你的MacOS App添加开机自启动(Swift)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/52104828 ...

  7. Centos 下添加开机自启动服务和脚本

    最近刚玩Centos7的系统,跟Centos6还是很多方面有改变的,这里记录一下怎么在Centos7下添加开机自启动脚本和服务的方法. 1.添加开机自启服务 我这里以docker 服务为例,设置如下两 ...

  8. Linux 添加开机启动项的三种方法

    linux 添加开机启动项的三种方法. (1)编辑文件 /etc/rc.local 输入命令:vim /etc/rc.local 将出现类似如下的文本片段: #!/bin/sh## This scri ...

  9. Centos 下添加开机自启动服务和脚本【转】

    最近刚玩Centos7的系统,跟Centos6还是很多方面有改变的,这里记录一下怎么在Centos7下添加开机自启动脚本和服务的方法. 1.添加开机自启服务 我这里以docker 服务为例,设置如下两 ...

  10. 【原】linux增加开机自启动脚本

    在rc.local脚本中添加开机自启动程序

随机推荐

  1. ARM SMMU 与 IOMMU 的区别

    ARM SMMU (System Memory Management Unit) 和 IOMMU (Input-Output Memory Management Unit) 都是用于管理系统内存访问和 ...

  2. Linux 提高cache命中率方法

    提高缓存命中率是优化系统性能的关键策略之一.以下是一些提高缓存命中率的有效方法: 数据局部性优化: 空间局部性:优化数据访问模式,使得数据访问在空间上连续,比如通过循环展开和数据重排. 时间局部性:确 ...

  3. AMBA总线协议(一)——一文看懂APB总线协议

    0.AMBA总线概括 AMBA(Advanced Microcontroller Bus Architecture) 总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高 ...

  4. 静态库封装之ComStr类

    ComStr.h #pragma once #include <string> #include <vector> using namespace std; class Com ...

  5. KubeKey 部署 K8s v1.28.8 实战

    在某些生产环境下,我们仅需要一个原生的 K8s 集群,无需部署 KubeSphere 这样的图形化管理控制台.在我们已有的技术栈里,已经习惯了利用 KubeKey 部署 KubeSphere 和 K8 ...

  6. 什么是前后端分离应用(Full-stack Separation),想当然就会理解错

    前后端分离应用指的是将应用的前端部分(用户界面与交互逻辑)和后端部分(业务逻辑.数据处理.服务器响应)拆分成独立的模块,各自通过 API 进行通信.这种架构设计的目的是提高开发效率.增强可扩展性和灵活 ...

  7. 修复一个kubernetes集群

    前几天有个朋友把他们的kubernetes集群搞挂了,让我帮忙恢复一下,由于很多现场都没有了,这里提供一下解决思路. 环境问题 该环境有一个master节点,即控制面pod(etcd.schedule ...

  8. burpsuit无法启动

    在安装burpsuit时,最难的并不是找带有注册机的burpsuit安装包. 而是因为一些底层的原因,无法打开 burpsuit. 提示 Your JRE appears to be version ...

  9. NDT论文翻译

    The Normal Distributions Transform: A New Approach to Laser Scan Matching 正态分布变换:激光扫描匹配的新方法 摘要:匹配 2D ...

  10. C++ 简易消息循环

    前言 本文将向大家介绍如何使用 C++ 的标准库实现一个异步和并发编程中都非常重要的编程模式:消息循环(Event Loop).尽管市面上存在不少库也提供了同样的功能,但有时候出于一些原因,我们并不想 ...