Linux | 开机自启动设置多场景实现

发布于:2025-05-21 ⋅ 阅读:(14) ⋅ 点赞:(0)

注:本文为“Llinux 设置开机自启”相关文章合辑。

略作重排,未整理去重。
如有内容异常,请看原文。


Linux 设置开机自启动的三种方法

幽夜卡尔
2022-10-22

一、在 /etc/rc.local 文件中添加自启动命令

  1. 编辑文件:执行以下命令,编辑 /etc/rc.local 文件。

    vi /etc/rc.local
    
  2. 添加命令:在文件的最后一行添加要执行程序的全路径。例如,若每次开机时要执行位于 /usr 下的 hello.sh 脚本,可在 /etc/rc.local 中添加一行 /usr/./hello.shcd /usr/ && ./hello.sh。注意,命令应添加在 exit 0 之前。

  3. 设置权限:保存文件后,设置 /etc/rc.local 的可执行权限。

    chmod +x /etc/rc.local
    

img

二、在 /etc/init.d 目录下添加自启动脚本

Linux 系统在 /etc/rc.d/init.d 目录下有许多文件,这些文件均为可查看内容的 Shell 脚本或可执行二进制文件。Linux 开机时会加载并运行 /etc/init.d 目录下的程序,因此可将需要自动运行的脚本放置于该目录下。系统服务的启动即通过此方式实现。添加完成后,务必设置文件的可执行权限,命令如下:

chmod +x filename

三、制作 Linux 服务并设置开机自启动

1. 简介

本文以 Nginx 为例,通过制作 Linux 服务的方式启动,并设置开机启动。

2. 前提条件

Nginx 已安装,其默认安装路径为 /usr/local/nginx

3. 方法步骤

  1. 制作服务:在 /etc/systemd/system/ 路径下创建 nginx.service 文件。

    cd /etc/systemd/system/
    vi nginx.service
    

    写入以下内容:

    [Unit]
    Description=nginx - high performance web server
    After=nginx.service
    
    [Service]
    Type=forking
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    Execenable=/usr/local/nginx/sbin/nginx
    
    [Install]
    WantedBy=multi-user.target
    

    保存并退出。

  2. 设置开机自启动

    # 设置开机启动
    systemctl enable nginx
    # 取消开机自启动
    #systemctl disable nginx
    # 查看服务当前状态
    systemctl status nginx
    # 启动 Nginx 服务
    systemctl start nginx
    # 停止 Nginx 服务
    systemctl stop nginx
    # 重启 Nginx 服务
    systemctl restart nginx
    

Linux 设置开机自启动的几种方式

ssooking
2023-05-25

一、在 /etc/rc.local 文件中添加自启动命令

执行命令:编辑 /etc/rc.local 文件,添加开机运行的命令。

运行程序脚本:在文件的最后一行添加要执行程序的全路径。例如,若每次开机时要执行位于 /usr 下的 hello.sh 脚本,可在 /etc/rc.local 中添加一行 /usr/./hello.shcd /opt && ./hello.sh。注意以下事项:

  1. 命令应添加在 exit 0 之前。
  2. 输入绝对路径。
  3. rc.local 添加执行权限。

img

二、在 /etc/init.d 目录下添加自启动脚本

Linux 系统在 /etc/rc.d/init.d 目录下有许多文件,这些文件均为可查看内容的 Shell 脚本或可执行二进制文件。Linux 开机时会加载并运行 /etc/init.d 目录下的程序,因此可将需要自动运行的脚本放置于该目录下。系统服务的启动即通过此方式实现。

三、运行级别设置

简而言之,运行级别是指操作系统当前正在运行的功能级别。不同的运行级别定义如下:

# 0 - 停机(千万不能把 initdefault 设置为 0)
# 1 - 单用户模式         进入方法 #init s = init 1
# 2 - 多用户,没有 NFS
# 3 - 完全多用户模式(标准的运行级)
# 4 - 没有用到
# 5 - X11 多用户图形模式(xwindow)
# 6 - 重新启动(千万不要把 initdefault 设置为 6)

例如,在 Ubuntu/Debian 系统中,可使用 update-rc.d 命令将示例脚本 /etc/init.d/proxy 安装到各个运行级别中。

update-rc.d proxy defaults 99

update-rc.d 后面有三个参数,分别是 /etc/init.d 下的脚本名称、默认安装方式以及运行的优先级。优先级的数字越大,表示越迟运行,此处将自定义服务放在最后运行。

若要卸载随机启动的服务,可执行以下命令:

update-rc.d -f proxy remove

在使用 update-rc.d 安装时,若出现警告信息,是因为 /etc/init.d/proxy 脚本过于简陋,未提供 LSB 信息。只需对自启动脚本进行如下小改动,即可避免该警告:

#!/bin/sh
### BEGIN INIT INFO
# Provides: proxy
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start or stop the HTTP Proxy.
### END INIT INFO

case "$1" in
start)
start-stop-daemon --start --background --exec /root/proxy.py
;;
stop)
start-stop-daemon --stop --name proxy.py
;;
esac

至此,一个最简单的随机启动服务已创建完成。尽管文章篇幅较长,但实际上仅涉及几个命令。下次开机时,proxy.py 将以 root 用户身份自动运行。

四、把脚本注册为系统服务

/etc/init.d 下新建示例脚本文件(startTest.sh),该脚本会启动 /opt/test.sh。脚本内容如下:

. /etc/init.d/functions
start() {
echo "Starting my process"
cd /opt
./test.sh
}
stop() {
killall test.sh
echo "Stopped"
}

完成脚本文件编写后,还需执行以下步骤:

chmod +x startTest        # 增加执行权限
chkconfig --add startTest     # 把 startTest 添加到系统服务列表
chkconfig startTest on       # 设定 startTest 的开关(on/off)
chkconfig --list startTest.sh   # 查看已注册的 startTest 服务

linux 设置开机自动启动应用,可屏蔽桌面

大大棋 于 2022-02-25 22:01:54 发布

本篇适合有需求将某些应用或者服务甚至是 QT 应用设置成开机启动的玩家,提供三种添加开机自启方式!

一、往/etc/rc.local中添加执行脚本

第一种是最简单也是最基本的方式,将需要开机自启的UI或者应用添加写成脚本的形式,放置在固定的位置;然后将该脚本的绝对路径添加到/etc/rc.local中。

在这里插入图片描述

这种方式可能比较简易,但是存在一个弊端,如果你需要开机启动一个QT的界面应用的话,这种方式会在启动之后会先显示一下桌面,然后在进入UI界面

但是可以通过ctrl+alt+F7切换回桌面,满足任意时刻切换到桌面进行调试的要求;同时可以通过ctrl+alt+F1~6切换回ui界面,一般是F1即可

二、往systemd中添加开机自启服务

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。在老版本的Linux上移植使用init进程来启动服务,而init进行的启动方式是串行启动,只有前一个进程启动完成后才会进行下一个进程的启动,所以较systemd低,所以systemd诞生后就取代了init.

在这里插入图片描述
Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

2.1 创建服务文件,编写systemd启动unit

每一个Unit都有一个配置文件,告诉Systemd怎么启动这个 Unit。Systemd默认从目录/etc/systemd/system/读取配置文件;

读懂配置文件

一个服务需要怎么启动,完全由它的配置文件决定的,systemd的服务文件后缀为.service,保存的文件路径在/etc/systemd/system下(一共有三个地方存放服务文件==具体使用方式,可以看我的另一篇博文systemd服务分析==);
在这里插入图片描述随便打开一个服务文件,比如sshd.service文件为例,其用于启动SSH服务,具体如下:

[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify

[Install]
WantedBy=multi-user.target
Alias=sshd.service

不难看出上面代码块一共包含三个区块,每个驱动下都有不同的key-value;

2.1.1 [Unit]:启动顺序和依赖关系
  • Unit区块的Description字段给出当前服务的简单描述,Documentation字段给出文档位置;
  • After字段:表示如果network.targetsshd-keygen.service需要启动,那么sshd.service应该在它们之后启动;
  • Before字段,定义sshd.service应该在哪些服务之前启动;
  • After和Before字段只涉及启动顺序,不涉及依赖关系;
  • Wants字段:表示sshd.servicesshd-keygen.service之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响sshd.service继续执行;
  • Requires字段则表示"强依赖"关系,即如果该服务启动失败或异常退出,那么sshd.service也必须退出;
  • Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
2.1.2 [Service]:启动行为,定义如何启动当前服务
  • EnvironmentFile字段:指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取;

  • ExecStart字段:定义启动进程时执行的命;

  • ExecReload字段:重启服务时执行的命令;

  • ExecStop字段:停止服务时执行的命令;

  • ExecStartPre字段:启动服务之前执行的命令;

  • ExecStartPost字段:启动服务之后执行的命令;

  • ExecStopPost字段:停止服务之后执行的命令;

    • Type 字段定义启动类型。它可以设置的值如下;
  • simple(默认值):ExecStart字段启动的进程为主进程;

    • forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程;
    • oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务;
    • dbus:类似于simple,但会等待 D-Bus 信号后启动;
    • notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务;
    • idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合;
  • KillMode 字段:定义Systemd如何停止sshd服务;

    • control-group(默认值):当前控制组里面的所有子进程,都会被杀掉;

    • process:只杀主进程;

    • mixed:主进程将收到SIGTERM信号,子进程收到SIGKILL信号;

    • none:没有进程会被杀掉,只是执行服务的stop命令;

  • Restart 字段:定义了sshd退出后,Systemd的重启方式;

    • no(默认值):退出后不会重启;
    • on-success:只有正常退出时(退出状态码为0),才会重启;
    • on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;
    • on-abnormal:只有被信号终止和超时,才会重启;
    • on-abort:只有在收到没有捕捉到的信号终止时,才会重启;
    • on-watchdog:超时退出,才会重启;
    • always:不管是什么退出原因,总是重启;
  • RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数。上面的例子设为等待42秒;

2.1.3 [Install]:定义如何安装这个配置文件,即怎样做到开机启动
  • WantedBy字段:表示该服务所在的 Target;Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target

这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。

systemd 的 target

Systemd 目标 注释
runlevel0.target, poweroff.target 中断系统(halt)
runlevel1.target, rescue.target 单用户模式
runlevel2.target, runlevel4.target, multi-user.target 用户自定义启动级别,通常识别为级别3。
runlevel3.target, multi-user.target 多用户,无图形界面。用户可以通过终端或网络登录。
runlevel5.target, graphical.target 多用户,图形界面。继承级别3的服务,并启动图形界面服务。
runlevel6.target, reboot.target 重启
emergency.target 急救模式(Emergency shell)

Systemd默认的启动Target为multi-user.target,我们也可以通过指令去查看当前启动的target

$systemctl get-default
multi-user.target

结果表示当前的target下所有的服务都将在开机时启动;

一般来说,常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target

2.2 创建服务文件

通过前面的分析,应该可以很清楚systemd启动服务的配置文件的编写规则,我们可以直接复制或者编写一套自己的服务文件;
比如说你新建一个服务文件名为:myui.service
编辑单元如下:

[Unit]
Description=my ui service

[Service]
Type=simple
ExecStart=你的应用或者脚本存放的路径,用于启动的
ExecReload=你的应用或者脚本存放的路径,用于重启的(非必要)
ExecStop=你的应用或者脚本存放的路径,用于停止的(非必要)
Restart=on-failure
RestartSec=42s
KillMode=process

[Install]
WantedBy=multi-user.target

2.3 添加到自启服务

完成前面的配置后,需要将该服务添加到自启服务中去,才可以实现开机自启。

sudo systemctl daemon-reload

设置开机自启

sudo systemctl enable gree

设置自启动,实质上就是在/etc/systemd/system/multi-user.target.wants/下添加服务文件的链接。

重启相关服务

sudo systemctl start gree.service

查看服务状态

sudo systemctl status gree.service

三、使用显示管理器启动

ubuntu使用的是显示管理器一般为:LightDM - 跨桌面显示管理器,可以使用任何工具包中编写的各种前端,当前开发机使用的Ubuntu16.04默认使用该管理器。

显示管理器也称登陆管理器,向用户显示登录屏幕,它们提供图形化登录并处理用户身份验证,当用户成功输入用户名和密码的有效组合时,会话开始。

大多数登录管理器会从/usr/share/xsessions/读取可用的.desktop文件,在安装各种窗口管理器时会在/usr/share/xsessions/下生成对应的desktop文件,比如ubuntu自带的ubuntu.desktop文件就在该文件下面,仿造它原来的启动文件配置自己的配置文件再进行启动更改即可;

3.1 .desktop配置

原ubuntu.desktop配置如下:

[Desktop Entry]
Name=Ubuntu
Comment=This session logs you into Ubuntu
Exec=gnome-session --session=ubuntu
TryExec=unity
Icon=
Type=Application
DesktopNames=Unity
X-Ubuntu-Gettext-Domain=gnome-session-3.0
123456789

.desktop涉及的语法规则如下:

Key 描述 Value 类型 是否必须?
Type Application (type1), Link (type2), Direcory (type3) string Yes
Version 版本,例如 1.1 string No
Name 应用程序的特定名称,例如 “Mozilla”。 localestring Yes
GenericName 应用程序的通用名称,例如 “Web 浏览器”。 localestring No
NoDisplay 不在菜单中显示,但可以与 MIME 类型相关联 boolean No
Comment 应用描述 ocalestring No
Icon 要么绝对路径,要么符合 图标主题 规范. localestring No
Hidden 是否隐藏,等同于不存在的文件 boolean No
OnlyShowIn, NotShowIn 一般不用此字段 boolean No
DBusActivatable DBus 激活,默认 false。参阅 D-Bus 激活.。应包含 Exec 行,实现兼容 boolean No
TryExec 如果文件不存在,则忽略该文件,并不在菜单中出现 string No
Exec 执行路径 。参阅 Exec Key . string No
Path 当 Type=Application 时,程序运行的目录 string No 1
Terminal 程序是否在终端窗口中运行。 boolean No
Actions 为其他组提供接口,比如 Action=Gallery;,那么其他组就为 [Desktop Action Gallery] string (s) No
MimeType 此应用支持打开的类型,具体类型可以百度 string (s) No
Categories 参阅 桌面菜单规范 . string (s) No
Implements 默认情况下,桌面文件不实现任何接口。参阅 接口 . string (s) No
Keywords 用于搜索,不应该是 Name 或者为多余的值 GenericName。 localestring (s) No
StartupNotify 如果不存在,则合理的处理取决于实现(假设为 false,使用 StartupWMClass 等)。参阅 启动通知协议规范. boolean No
StartupWMClass 一般跟 Name 相同即可 string No
URL 只适用于 Type=Link string Yes

直接复制原 ubuntu 的桌面启动文件,更名为你指定的文件

sudo cp /usr/share/xsessions/ubuntu.desktop yourfile.desktop

删除不必要的key避免造成不必要的麻烦,如下:

[Desktop Entry]
Name=yourapp
Comment=This session xxxxxxx
Exec=/你的待执行的应用路径
Icon=
Type=Application
  • 第4行,可执行文件的绝对路径,该KEY是必选的;

3.2 添加到启动项

完成到3.1 .desktop配置已经可以满足手动去启动程序了,就类似一个图标,接下来需要设置为登陆管理器自动启动;

3、使用显示管理器启动提到ubuntu使用的是lightdm作为登陆管理器,所以我们需要设置该管理器进行自动启动,编辑lightdm的配置文件/etc/lightdm/lightdm.conf,如下:

[Seat:*]
autologin-guest=false
autologin-user=gree
autologin-user-timeout=0
#autologin-session=app
#autologin-session=xterm
#autologin-session=openbox
#autologin-session=ubuntu
autologin-session=yourfile // 这里的yourfile和yourfile.desktop相关

和shell脚本一样,使用#号进行注释,注释第8行,添加第9行;需要注意的有如下几点:

  • autologin-user字段必须是该autologin 群组的一员才能在不输入密码的情况下自动登录;本文的gree属于autologin 群组;
  • autologin-session字段更改为3.1 .desktop配置中的yourfile.desktop,保留yourfile填入即可。

Linux设置软件开机自启动的三种方式(中标麒麟、银河麒麟、ubuntu)

从此开始低调范✌️已于 2023-05-17 10:54:54 修改

一、有界面的程序自启动

利用Linux的 .desktop文件实现开机启动。

/etc/xdg/autostart 目录下建立一个 test.desktop文件,并对文件进行以下编辑。

操作步骤

  1. 打开/etc/xdg/autostart目录

    cd /etc/xdg/autostart
    
  2. 建立test.desktop文件

    touch test.desktop
    
  3. 编写文件并保存

    sudo vim test.desktop
    

添加如下代码:

[Desktop Entry]
Name=Test	 		#可执行文件名字
Exec=/root/Test 	#可执行文件路径
Type=Application	#可执行文件类型

桌面条目具体要求和含义可见:

https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html

注意

  1. 需要root权限
  2. 此设置开机自启动的方法与rc.local方法不同的是,此方法适合桌面级软件的开机自启动(软件有界面)

二、无界面的程序自启动

① 方式一

Ubuntu 20.04的服务管理是基于systemd的,因此设置服务自启动最推荐的方法是在/etc/systemd/user目录下创建一个systemd服务文件,配置好要执行的服务。

该种方式在ExecStart字段中指定开机自启动的程序是可执行文件的时候会管用,但在某些情况下,当ExecStart字段指定为脚本文件时可能会失效,并且此方式貌似需要登录系统后才会启动指定的程序

操作步骤
  1. 创建我们需要开机自启动的脚本,例如test.sh,其内容如下:

    #!/bin/bash
    
    cd ~/
    touch 11111111111.txt
    
  2. 在/etc/systemd/user目录下创建一个systemd服务文件, 命名为user-defined.service(可以命名为以.service结尾的任何名称), 内容如下:

    [Unit]
    After=network.service
    # After表示在哪个服务启动后启动我们的程序,After=network.service 表示网络连接完成后,启动我们的程序
    
    [Service]
    ExecStart=/home/hqc/test.sh # 此处只能绝对路径
    # ExecStart表示我们的脚本(步骤1中的test.sh)的执行路径
    
    [Install]
    WantedBy=default.target
    # WantedBy默认填default.target,表示我们程序所在的服务组。
    
  3. 将systemd服务文件和我们的脚本更改权限,使其可执行。

    sudo chmod 744 ~/test.sh
    sudo chmod 664 /etc/systemd/user/user-defined.service
    
  4. 重新加载系统的systemd服务文件,并启用我们自己写的user-defined.service文件。

    sudo systemctl daemon-reload
    systemctl --user enable user-defined.service
    
取消开机自启动
systemctl --user disable user-defined.service
cd /etc/systemd/user
rm user-defined.service

② 方式二

现在大部分的Linux发布版本开机第一个程序都从init换成了systemd这中启动方式。systemd是靠管理unit的方式来控制开机服务、开机级别等功能。

/usr/lib/systemd/system目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.serviceunit控制的,服务又分为系统服务(system)和用户服务(user)。

  • 系统服务:开机不登录就能运行的程序(常用于开机自启)。
  • 用户服务:需要登录以后才能运行的程序。
配置文件说明

(以sshd.service服务为例)

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

  • [Service]区块:启动行为。

    • 启动命令
      ExecStart字段:定义启动进程时执行的命令。
      ExecReload字段:重启服务时执行的命令。
      ExecStop字段:停止服务时执行的命令。
      ExecStartPre字段:启动服务之前执行的命令。
      ExecStartPost字段:启动服务之后执行的命令。
      ExecStopPost字段:停止服务之后执行的命令。
      注:所有的启动设置之前都可以加一个连词号(-),表示“抑制错误”,即发生错误的时候,不影响其他命令的执行。比如EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误。[Service]中的启动、重启、停止命令要求全部使用绝对路径!

    • 启动类型
      Type字段定义启动类型。
      它可以设置的值如下:

      • simple(默认值):ExecStart字段启动的进程为主进程
      • forkingExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程(后台运行)
      • oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
      • dbus:类似于simple,但会等待D-Bus信号后启动
      • notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
      • idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合。
    • 重启行为
      Service区块有一些字段,定义了重启行为。

      • KillMode字段:定义 Systemd 如何停止 sshd 服务:

        • control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
        • process:只杀主进程
        • mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
        • none:没有进程会被杀掉,只是执行服务的 stop 命令。
      • Restart字段:定义了sshd退出后,Systemd 的重启方式

        • no(默认值):退出后不会重启
        • on-success:只有正常退出时(退出状态码为0),才会重启
        • on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
        • on-abnormal:只有被信号终止和超时,才会重启
        • on-abort:只有在收到没有捕捉到的信号终止时,才会重启
        • on-watchdog:超时退出,才会重启
        • always:不管是什么退出原因,总是重启

        Restart设为on-failure,表示任何意外的失败,就将重启sshd。如果 sshd 正常停止(比如执行systemctl stop命令),它就不会重启。

        注:[对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal]

      • RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数。

  • [Install]区块
    Install区块定义如何安装这个配置文件,即怎样做到开机启动。

    • WantedBy字段:表示该服务所在的 Target

    • Target的含义是服务组,表示一组服务。

    • WantedBy=multi-user.target指的是:sshd 所在的 Target multi-user.target
      这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
      Systemd 有默认的启动 Target

      systemctl get-default
      #输出multi-user.target
      12
      

      上面的结果表示,默认的启动 Targetmulti-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。
      使用 Target 的时候,systemctl list-dependencies命令和systemctl isolate命令也很有用。

      #查看 multi-user.target 包含的所有服务
      systemctl list-dependencies multi-user.target
      
      #切换到另一个 target
      #shutdown.target 就是关机状态
      systemctl isolate shutdown.target
      123456
      

      一般来说,常用的Target有两个:
      multi-user.target:表示多用户命令行状态;
      graphical.target:表示图形用户状态,它依赖于multi-user.target

注册服务实例
  • 配置文件目录
    systemctl脚本目录:/usr/lib/systemd/
    系统服务目录:/usr/lib/systemd/system/
    用户服务目录:/usr/lib/systemd/user/

  • /usr/lib/systemd/system目录下新建service-name.service文件:

    [Unit]
    #服务描述
    #Description=Media wanager Service
    #指定了在systemd在执行完那些target之后再启动该服务
    After=network.target
    
    [Service]
    #定义Service的运行类型,这种一般是开机自启动文件就是可执行文件
    Type=simple
    
    #Type=forking,这种一般是开机自启动文件为shell脚本文件,脚本文件里面可能写了多个需要
    #开机自启动的程序,forking代表子进程的方式,就是脚本里的程序以子进程后台运行。
    #WorkingDirectory=工作目录 #该项设置自启动软件的工作目录。
    #定义systemctl start|stop|reload *.service 的执行方法(具体命令需要写绝对路径)
    #注:ExecStartPre为启动前执行的命令
    ExecStartPre=/usr/bin/test "x${NETWORKMANAGER}" = xyes
    ExecStart=/home/mobileoa/apps/shMediaManager.sh -start#-start加不加都行
    #创建私有的内存临时空间
    PrivateTmp=True
    
    [Install]
    #多用户
    WantedBy=multi-user.target
    

重载系统服务:systemctl daemon-reload

设置开机启动:systemctl enable *.service

启动服务:systemctl start *.service

停止服务:systemctl stop *.service

重启服务:systemctl restart *.service

注:[修改完配置文件要重载配置文件]

三、补充

适用于无界面的程序自启动

对于有/etc/rc.d/rc.local/etc/rc.local文件的Linux发行版本,开机自启动只需要在/etc/rc.local文件中添加上自己程序的路径即可,但如果程序是有界面的,仍然只能使用方法一来设置开机自启动。

注:现在已经不提倡使用这种方式设置开机自启动了,如果使用过程中设置失败了,需要查看/etc/rc.d/rc.local文件是否具有可执行权限(/etc/rc.local只是/etc/rc.d/rc.local的软链接,添加/etc/rc.local文件的可执行权限是不管用的)。


via:


网站公告

今日签到

点亮在社区的每一天
去签到