4:手动添加systemctl 服务。
为什么要手动添加systemctl服务呢?正常来说,nginx是使用yum或者apt-get来安装的。这种安装方式会将服务自动波添加至systemctl。但是,我要是编译安装的nginx,我就需要手动将nginx添加到systemctl中才可以使用systemctl命令来启动nginx。
那么如何手动将编译的nginx添加至systemctl呢?
我们先去systemctl目录找到nginx的系统服务文件,直接手写可能是要求有点高,照着改一份不就完了嘛。
nginx.service:
ini
复制代码
[Unit] # 服务的简单描述 Description=A high performance web server and a reverse proxy server # 服务文档 Documentation=man:nginx(8) # Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。 After=network.target [Service] # Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。 # Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。 # Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。 # Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。 # Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。 # Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。 Type=forking # pid文件路径 PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' # 指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。 ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' # 指定单元停止时执行的命令或者脚本。 ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload # 指定单元停止时执行的命令或者脚本。 ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid # TimeoutStopSec=5 # KillMode=mixed [Install] # WantedBy字段:表示该服务所在的 Target。 WantedBy=multi-user.target
以上大概是nginx.service的文件内容,以及相关字段的注解。
下边我们自己来尝试一下,创建一个test.sh文件,然后为test.sh文件注册一个系统服务。
test.sh
bash
复制代码
#!/bin/bash echo "i love u" > /home/camellia/a.txt
testsh.service
ini
复制代码
[Unit] Description=test.sh Service [Service] Type=forking User=camellia ExecStart=/home/camellia/test.sh [Install] WantedBy=multi-user.target
然后执行重载systemctl服务文件命令:
复制代码
sudo systemctl daemon-reload
然后再执行:
sql
复制代码
systemctl start testsh.service
我们打开/home/camellia/a.txt文件,如下图所示:
5:一些常用的systemctl命令
(1):系统命令
重启系统
复制代码
sudo systemctl reboot
关闭系统,切断电源
复制代码
sudo systemctl poweroff
CPU停止工作
复制代码
sudo systemctl halt
暂停系统
bash
复制代码
sudo systemctl suspend
让系统进入冬眠状态
复制代码
sudo systemctl hibernate
让系统进入交互式休眠状态
perl
复制代码
sudo systemctl hybrid-sleep
启动进入救援状态(单用户状态)
ruby
复制代码
sudo systemctl rescue
设置主机名。
arduino
复制代码
sudo hostnamectl set-hostname rhel7
显示当前主机的信息
复制代码
hostnamectl
设置主机名。
arduino
复制代码
sudo hostnamectl set-hostname rhel7
查看当前运行的所有服务:
复制代码
systemctl list-units
查看服务是否开机启动:
复制代码
systemctl list-unit-files
这个命令比较有意思,详细说一下。在系统中执行这个命令,如下图所示:
State表示服务当前的启动状态,vendor preset表示服务默认的启动状态(是否开机自启)
其中Enabled表明服务正在运行;Disabled表明服务当前没有运行;Masked表示服务不会被运行,除非我们手动移除这个标志;Static表示服务只有在别的服务或单元需要它时才被使用。
主要是,我们可以使用这个命令来管理服务器上边自启的软件。这个很重要