Linux-Service
Linux service 和 systemd 相关笔记
service系统服务(RHEL/CentOS 6.x及之前)
service
service 命令是 RHEL/Centos 6.x 及之前的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。service
命令管理的服务都在 /etc/ini.d/
目录下对应一个脚本,service
命令中的服务名就是 /etc/ini.d/
中的脚本名。
例如:service httpd start
启动mysql服务service httpd stop
停止mysql服务service httpd restart
重启mysql服务service httpd status
检查httpd服务状态
如何增加一个服务
1、服务脚本必须存放在 /etc/ini.d/
目录下;
2、chkconfig --add servicename
在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;
3、chkconfig --level 35 mysqld on
修改服务的默认启动等级。
chkconfig
RHEL/Centos 6.x 及之前版本中,使用 service
和 chkconfig
管理服务。chkconfig
命令检查、设置系统的各种服务。它可查询操作系统在每一个执行等级中会执行哪些系统服务。
--list
: 列出系统所有的服务启动情况chkconfig --add name
: 增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。 chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。chkconfig --del name
: 删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。并把相关符号连接从 /etc/rc[0-6].d
删除chkconfig [--level levels] name
: 设置某一服务在指定的运行级是被启动,停止还是重置。指定读系统服务要在哪一个执行等级中开启或关毕。
等级代号列表:
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
chkconfig在没有参数运行时,显示用法。
如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回true,否则返回false。
如果在服务名后面指定了on,off或者reset,那么chkconfig 会改变指定服务的启动信息。on和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。on和off开关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。
例如:chkconfig --list
, 列出系统所有服务的开机启动情况。
$ chkconfig --list|egrep 'mysql|nginx'
mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
nginx 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
chkconfig mysqld on
, 设定mysqld在各等级为开机启动chkconfig --level 35 mysqld on
, 设定mysqld在等级3和5为开机运行服务,--level 35
表示操作只在等级3和5执行,on表示启动,off表示关闭。
alternatives
系统中同一个命令有多个实现版本时, 可以使用 alternatives
命令设置默认选择。只能在 root 权限下执行。
alternatives 常用于同一个系统中安装同一软件的多个版本。比如为了开发需要,我需要安装 JDK1.4.2,同时还需要 JDK1.6.10,我怎么样才能忽略安装路径,按照我自己的意思,使用我想要的java版本呢?
$ alternatives --help
usage: alternatives --install <link> <name> <path> <priority>
[--initscript <service>]
[--slave <link> <name> <path>]*
alternatives --remove <name> <path>
alternatives --auto <name>
alternatives --config <name>
alternatives --display <name>
alternatives --set <name> <path>
common options: --verbose --test --help --usage --version
--altdir <directory> --admindir <directory>
alternatives --install <link> <name> <path> <priority>
添加候选项
其中,
install表示安装
link是符号链接
name则是标识符
path是执行文件的路径
priority则表示优先级
例如向系统添加一个新安装的java命令版本 alternatives --install /usr/bin/java java /tools/jdk/bin/java 3
设置默认java版本
比如系统中同时装了 java5 和 java7
$ alternatives --config java
There are 2 programs which provide 'java'.
Selection Command
-----------------------------------------------
*+ 1 /usr/lib/jvm/jre-1.7.0-icedtea/bin/java
2 /usr/lib/jvm/jre-1.5.0-gcj/bin/java
Enter to keep the current selection[+], or type selection number:
当前默认 java
命令由序号为1的java7提供,如果想改为java5,根据提示按2即可。
设置默认邮件发送MTA
设置系统默认mta为postfix
alternatives --config mta
There are 2 programs which provide 'mta'.
Selection Command
-----------------------------------------------
+ 1 /usr/sbin/sendmail.postfix
* 2 /usr/sbin/sendmail.sendmail
Enter to keep the current selection[+], or type selection number: 1
输入1后回车即把MTA功能切换到postfix上,+号会显示在sendmail的行头。
systemd系统服务(RHEL/Centos 7.x及之后)
RHEL/Centos 7.x 开始使用 systemctl
代替 service
和 chkconfig
来管理服务, 区分 RHEL/CentOS 6.x和7.x就看系统里有没有 systemctl
命令即可
在 systemd 管理体系里,称呼需要管理的 daemon 为单元(unit)。对于单元(unit)的管理是通过命令 systemctl 来进行控制的。
systemctl 命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。
systemctl --version
查看 systemd 版本
Systemd 入门教程:命令篇
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
systemctl status 查看服务运行状态
systemctl status docker
或 systemctl status docker.service
例如查看 docker 的运行状态
# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2020-06-26 10:24:55 CST; 1 years 4 months ago
Docs: https://docs.docker.com
Main PID: 14192 (dockerd)
Memory: 500.4M
CGroup: /system.slice/docker.service
├─ 5437 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/feddf8428c0d68590cf95a26265ac86d1a9611e8e44595146e37eb304e79c8c5 -address /var/run/docker/contai...
├─ 6361 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/63d370a70fe8751e9647c71fa9671dead5a7077a179b48ce4b202867d73b8d2c -address /var/run/docker/contai...
├─10900 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/b7f66ef69da22e9caca812d42285763b2998540271f91b2ad77323bfd5c59cdf -address /var/run/docker/contai...
├─11733 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/b317eb6348031d896f27f0882444eff1e0ec6733c90150c15e3e4a314dac051f -address /var/run/docker/contai...
├─14192 /usr/bin/dockerd
├─14205 docker-containerd --config /var/run/docker/containerd/containerd.toml
├─22546 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/39e7a478b84b4f244a3e85921ca2cdb44a3ede5b6a39d508c57ba381e2481112 -address /var/run/docker/contai...
├─24230 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/d1557656dcfca779693206efcf295df17f5c3df7b4a414409766b25aa4ef8ede -address /var/run/docker/contai...
├─25823 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/d51b266c903189b7f1332496fb6dd5deb4ca64b40c64e0298442830070e328ef -address /var/run/docker/contai...
└─30302 docker-containerd-shim -namespace moby -workdir /data3/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/18ee12b1a0afd57683156da7a7855f4f3f495d7893ca17fb5f89ec7f4755687f -address /var/run/docker/contai...
systemctl enable 设置开机启动
对于那些支持 Systemd 的软件,安装的时候,会自动在 /usr/lib/systemd/system 目录添加一个配置文件。
如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。sudo systemctl enable httpd
上面的命令相当于在 /etc/systemd/system 目录添加一个符号链接,指向 /usr/lib/systemd/system 里面的 httpd.service 文件。
这是因为开机时,Systemd 只执行 /etc/systemd/system 目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。
比如设置 kubelet 开机启动时,给出的提示就是在 /usr/lib/systemd/system 中创建了一个符号链
$ sudo systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
sudo systemctl enable --now
设置为开机自动激活单元并现在立刻启动
systemctl disable 删除开机启动项
sudo systemctl disable kubelet
删除开启启动 kubelet
systemctl list-unit-files 查看是否开机启动
systemctl list-unit-files
, 结果中 左边是服务名称,右边是状态,enabled是开机启动,disabled是开机不启动
systemctl list-unit-files | grep enable
, 查看所有开机启动的服务
systemctl list-unit-files | grep mysql
, 查看mysql是否设置了开机启动
systemctl list-units –type=service 查看已启动的服务
# systemctl list-units --type=service|grep hdfs
hdfs-datanode.service loaded active running HDFS datanode
hdfs-namenode.service loaded active running HDFS namenode
systemctl daemon-reload 重新加载unit配置
sudo systemctl daemon-reload
重载所有修改过的配置文件,这里的配置文件指的是 /usr/lib/systemd 目录中的各种 service 配置。
新添加 unit 配置文件时需要执行 daemon-reload 子命令
有 unit 的配置文件发生变化时也需要执行 daemon-reload 子命令
daemon-reload 命令会做很多的事情,其中之一是重新生成依赖树(也就是 unit 之间的依赖关系),所以当你修改了 unit 配置文件中的依赖关系后如果不执行 daemon-reload 命令是不会生效的。
systemctl start 启动服务
设置开机启动以后,软件并不会立即启动,必须等到下一次开机。如果想现在就运行该软件,那么要执行 systemctl start 命令。sudo systemctl start httpd
systemctl/service/chkconfig命令对比
daemon命令 | systemctl命令 | 说明 |
---|---|---|
service mysql start | systemctl start mysql.service | 启动服务 |
service nginx stop | systemctl stop nginx.service | 停止服务 |
service mysql restart | systemctl restart mysql.service | 重启服务 |
service httpd status | systemctl status httpd.service | 检查服务状态 |
chkconfig mysql on | systemctl enable mysql.service | 使某服务自动启动 |
chkconfig mysql off | systemctl disable mysql.service | 使某服务不自动启动 |
chkconfig –list | systemctl list-units –type=service | 显示所有已启动的服务 |
chkconfig | systemctl list-unit-files | 查看服务是否开机启动 |
系统服务管理/usr/lib/systemd/
CentOS 7 的服务 systemctl 脚本存放在:/usr/lib/systemd/
,有系统(system)和用户(user)之分,
系统服务在 /usr/lib/systemd/system/
目录中
用户服务在 /usr/lib/systemd/user/
目录中
像需要开机不登陆就能运行的程序,存在系统服务,即:/usr/lib/systemd/system/ 目录下
每个服务以 .service
结尾,一般会分为 3 部分:[Unit]、[Service]、[Install]
[Unit]
主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别
[Service]
是服务的关键,是服务的一些具体运行参数的设置,
Type=forking是后台运行的形式,
PIDFile为存放PID的文件路径,
ExecStart为服务的具体运行命令,
ExecReload为重启命令,
ExecStop为停止命令,
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
Restart字段:定义了 sshd 退出后,Systemd 的重启方式。
Restart字段可以设置的值如下:
no(默认值):退出后不会重启
on-success:只有正常退出时(退出状态码为0),才会重启
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启
[Install]
是服务安装的相关设置,可设置为多用户的
服务脚本按照上面编写完成后,以 754 的权限保存在 /usr/lib/systemd/system/ 目录下,这时就可以利用 systemctl 进行配置
配置systemd服务(x.service.d 目录)
systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,建议不要修改!而要修改的位置应该放置于 /etc/systemd/system/ 目录内。
举例来说,如果你想要额外修改 vsftpd.service 的话,有以下几个地方的配置文件可用:
1、/usr/lib/systemd/system/vsftpd.service
官方释出的默认配置文件,不建议直接改官方的,而是新建一个。
2、/etc/systemd/system/vsftpd.service.d/custom.conf
在 /etc/systemd/system 下面创建与配置文件相同文件名的目录,但是要加上 .d 的扩展名。然后在该目录下创建配置文件即可。另外,配置文件最好附文件名取名为 .conf 较佳! 在这个目录下的文件会“累加其他设置”进入 /usr/lib/systemd/system/vsftpd.service 内喔!
3、/etc/systemd/system/vsftpd.service.wants/*
此目录内的文件为链接文件,设置相依服务的链接。意思是启动了 vsftpd.service 之后,最好再加上这目录下面建议的服务。
4、/etc/systemd/system/vsftpd.service.requires/*
此目录内的文件为链接文件,设置相依服务的链接。意思是在启动 vsftpd.service 之前,需要事先启动哪些服务的意思。
17.3 systemctl 针对 service 类型的配置文件
https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/150.html
mysqld.service
例如 mysqld.service 文件内容为:
#
# Simple MySQL systemd service file
#
# systemd supports lots of fancy features, look here (and linked docs) for a full list:
# http://www.freedesktop.org/software/systemd/man/systemd.exec.html
#
# Note: this file ( /usr/lib/systemd/system/mysql.service )
# will be overwritten on package upgrade, please copy the file to
#
# /etc/systemd/system/mysql.service
#
# to make needed changes.
#
# systemd-delta can be used to check differences between the two mysql.service files.
#
[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
Alias=mysql.service
[Service]
User=mysql
Group=mysql
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables etc.
ExecStartPre=/usr/bin/mysql-systemd-start pre
# Start main service
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-start post
# Give up if ping don't get an answer
TimeoutSec=600
Restart=always
PrivateTmp=false
nginx.service
nginx.service 的内容为:
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
自定义service
我们的一个service示例:
[Unit]
Description=user
After=network.target
[Service]
Type=forking
PIDFile=/data/app/masikkk/user.pid
EnvironmentFile=/data/app/masikkk/conf/service_env
ExecStart=/data/app/masikkk/bin/start.sh test
ExecStop=/data/app/masikkk/bin/stop.sh
PrivateTmp=false
TimeoutStartSec=500
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Systemd 入门教程:实战篇
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
systemctl 命令完全指南
https://linux.cn/article-5926-1.html
systemd-logind
systemd-logind 是一个管理用户登录的系统服务。其职责如下:
持续跟踪用户的会话、进程、空闲状态。 这将在 user.slice 之下,为每个用户分配一个 slice 单元、为每个用户的当前会话分配一个 scope 单元。 同时,针对每个已登录的用户,将会启动一个专属的服务管理器(作为 user@.service 模版的一个实例)。
生成并管理”session ID”。如果启用了审计并且已经为一个会话设置了审计”session ID”, 那么该ID也将同时被用作”session ID”, 否则将会使用一个独立的会话计数器(也就是独立生成一个”session ID”)。
为用户的特权操作(例如关闭或休眠系统) 提供基于 polkit 的认证与授权
为应用程序实现 阻止关闭/休眠系统的逻辑
处理 硬件关机/休眠按钮的动作
多席位(Multi-Seat)管理
会话切换管理
管理 用户对设备的访问
在启动虚拟终端时 自动启动文本登录程序(agetty), 并管理用户的运行时目录。
The maximum number of pending replies…reached
# systemctl status systemd-logind
● systemd-logind.service - Login Service
Loaded: loaded (/usr/lib/systemd/system/systemd-logind.service; static; vendor preset: disabled)
Active: active (running) since 五 2022-04-01 03:08:00 CST; 1 years 6 months ago
Docs: man:systemd-logind.service(8)
man:logind.conf(5)
http://www.freedesktop.org/wiki/Software/systemd/logind
http://www.freedesktop.org/wiki/Software/systemd/multiseat
Main PID: 11904 (systemd-logind)
Status: "Processing requests..."
Tasks: 1
Memory: 24.3M
CGroup: /system.slice/systemd-logind.service
└─11904 /usr/lib/systemd/systemd-logind
10月 10 21:28:01 centos systemd-logind[11904]: Failed to start session scope session-804464.scope: The maximum number of pending replies...reached
10月 10 21:29:01 centos systemd-logind[11904]: Failed to start session scope session-804465.scope: The maximum number of pending replies...reached
10月 10 21:30:01 centos systemd-logind[11904]: Failed to start session scope session-804466.scope: The maximum number of pending replies...reached
loginctl list-sessions 列出当前session
# loginctl list-sessions
SESSION UID USER SEAT
84272 0 root
1 sessions listed.
loginctl list-users 列出当前登录用户
上一篇 MySQL-SQL语句
下一篇 Linux-YUM
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: