当前位置 : 首页 » 文章分类 :  开发  »  Linux-Service

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 及之前版本中,使用 servicechkconfig 管理服务。
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 代替 servicechkconfig 来管理服务, 区分 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 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 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

journalctl 查看服务日志

journalctl 可用于检索 systemd 日志(由 systemd-journald.service 记录)。
Systemd 统一管理所有 Unit 的启动日志,可以只用 journalctl 一个命令查看所有日志(内核日志和 应用日志)。
日志的配置文件 /etc/systemd/journald.conf
journalctl 工具是 CentOS7 才有的工具

-k 查看内核日志
-b 查看系统本次启动的日志
-n 指定日志条数

-x --catalog 在日志的输出中 增加一些解释性的短文本, 以帮助进一步说明 日志的含义、 问题的解决方案、支持论坛、 开发文档、以及其他任何内容。 并非所有日志都有 这些额外的帮助文本
-e --pager-end 在分页工具内 立即跳转到日志的尾部。 此选项隐含了 -n1000 以确保分页工具不必缓存太多的日志行。 不过这个隐含的行数可以被明确设置的 -n 选项覆盖。
-f --follow 只显示最新的日志项, 并且不断显示新生成的日志项。 此选项隐含了 -n 选项。
-u --unit=UNIT 查看指定服务的日志。仅显示 属于特定单元的日志。 也就是单元名称正好等于 UNIT 或者符合 PATTERN 模式的单元。 这相当于添加了一个 “_SYSTEMD_UNIT=UNIT” 匹配项(对于 UNIT 来说), 或一组匹配项(对于 PATTERN 来说)。

journalctl 查看所有日志(默认情况下 ,只保存本次启动的日志)如果不带任何参数直接调用此命令, 那么将显示所有日志内容 (从最早一条日志记录开始)。
journalctl -n 20 查看最近发生的20条日志
journalctl -f 滚动输出最新日志
journalctl -u httpd 查看httpd服务的日志信息

sudo journalctl -xefu kubelet 查看 kubelet 的启动错误日志。

查看进程被谁kill了

dmesg | egrep -i -B100 'killed process'

或:
egrep -i 'killed process' /var/log/messages
egrep -i -r 'killed process' /var/log

或:
journalctl -xb | egrep -i 'killed process'

# journalctl -xb | egrep -i 'killed process'
Oct 23 22:56:39 centos kernel: Killed process 19326 (java) total-vm:42501688kB, anon-rss:4152696kB, file-rss:4044kB, shmem-rss:0kB
Oct 24 18:57:06 centos kernel: Killed process 48484 (mongod) total-vm:71151988kB, anon-rss:70203076kB, file-rss:0kB, shmem-rss:0kB
Oct 25 03:30:26 centos kernel: Killed process 63385 (ass-server) total-vm:60901276kB, anon-rss:54418832kB, file-rss:80kB, shmem-rss:0kB

我的进程去哪儿了,谁杀了我的进程
https://www.cnblogs.com/xybaby/p/8098229.html

What killed my process and why?
https://stackoverflow.com/questions/726690/what-killed-my-process-and-why

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 显示所有已启动的服务

系统服务管理/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


上一篇 MySQL-SQL语句

下一篇 Linux-YUM

阅读
评论
4.2k
阅读预计18分钟
创建日期 2021-07-16
修改日期 2021-07-16
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论