文章目录
- 知识点
- 实验
- 一、systemd
- (一)自写一个sh脚本并加入开机启动
- (二)源码安装的nginx加入开机启动
- rc.local
知识点
在Linux系统中,有多种方法可以设置开机启动。以下是其中的一些主要方法:
systemd
- 在较新的Linux发行版中,
systemd
是默认的初始化和服务管理工具。 - 可以在
/etc/systemd/system/
目录中创建一个新的单元文件,用于定义自启动的服务。 - 单元文件通常包含服务的描述、依赖关系、要执行的命令等。
rc.local
- 打开/etc/rc.d/rc.local文件,在文件的末尾添加要执行的命令或脚本的全路径。
- 确保为rc.local文件添加执行权限,可以使用
chmod +x /etc/rc.d/rc.local
crontab
- 编辑crontab文件,并添加一行如
@reboot your_command
的命令,其中your_command是要在启动时执行的命令。
/etc/init.d/
- 在/etc/init.d/目录下创建一个新的启动脚本,并为其添加执行权限。
- 使用
update-rc.d
命令(在Debian/Ubuntu系统中)或chkconfig
命令(在CentOS/RedHat系统中)将脚本链接到适当的运行级别。
实验
这是主要实验前两种方式
一、systemd
(一)自写一个sh脚本并加入开机启动
vim /usr/local/WF/rebootechotime.sh
脚本内容如下:
#!/usr/bin/sh
#/usr/local/WF/rebootechotime.sh
echo "reboot time is:" >> /usr/local/WF/rebootechotime.txt
date >> /usr/local/WF/rebootechotime.txt
脚本每次开机启动一次,并将开机时间记录在rebootechotime.txt文件中
cd /usr/local/WF
ll
可以看到当前脚本没有可执行的权限
chmod a+x rebootechotime.sh
现在有执行权限了,执行一下:
./rebootechotime.sh
cat rebootechotime.txt
致此,当前脚本可以独立运行了。
接下来,写servie
vim /etc/systemd/system/rebootechotime.service
[Unit]
Description=rebootechotime
After=network.target
[Service]
User=root
ExecStart=/usr/local/WF/rebootechotime.sh
[Install]
WantedBy=multi-user.target
测试一下服务是否可以正常启动
cat /usr/local/WF/rebootechotime.txt
systemctl daemon-reload
systemctl start rebootechotime
cat /usr/local/WF/rebootechotime.txt
设置开机启动
systemctl enable rebootechotime
查看服务启动日志
journalctl -u rebootechotime
(二)源码安装的nginx加入开机启动
这里以nginx为例,因为笔者的nginx是源码安装的,使用systemctl是无法管理的
1.前提:
当前启动nginx的方法使用绝对路径和相对路径两种方式:
/usr/local/nginx/sbin/nginx
或
cd /usr/local/nignx/sbin && ./nginx
2.添加systemd服务
vim /etc/systemd/system/nginx.service
文件内容如下:
[Unit]
Description=nginx service
After=network.target
[Service]
User=root
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecStartPre=/bin/sleep 10
[Install]
WantedBy=multi-user.target
解析
-
User=root:这表示服务将以 root 用户的身份运行。虽然 nginx 通常可以作为一个非 root 用户运行,但在这个配置中,它被设置为以 root 用户身份运行。出于安全考虑,通常建议避免以 root 用户身份运行服务,除非有特定的理由。
-
Type=forking:这指定了服务类型。forking 类型表示服务在启动时会立即返回,而实际的进程将在后台运行。systemd 会等待进程退出,并假定子进程是服务的实际主进程。这是传统 Unix 守护进程的标准行为。
-
ExecStart=/usr/local/nginx/sbin/nginx:这定义了服务启动时应该运行的命令。在这个例子中,它指定了 nginx 的主可执行文件的路径。
-
ExecReload=/usr/local/nginx/sbin/nginx -s reload:当服务需要重新加载配置时(例如,当 systemctl reload nginx 被调用时),这个命令将被执行。在这个例子中,它发送了一个 reload 信号给 nginx 主进程,以重新加载配置。
-
ExecStop=/usr/local/nginx/sbin/nginx -s stop:当服务需要停止时(例如,当 systemctl stop nginx 被调用时),这个命令将被执行。在这个例子中,它发送了一个 stop 信号给 nginx 主进程,以优雅地停止服务。
-
ExecStartPre=/bin/sleep 10:这是一个比较少见的指令,它定义了在 ExecStart 之前的命令。在这个例子中,服务启动前会等待 10 秒。这通常不是一个好的做法,因为它会延迟服务的启动时间,除非有特定的理由(例如,等待其他服务启动或某个资源变得可用)。
3.加入开机启动
systemctl enable nginx
rc.local
首先将前面写的开机启动取消掉
systemctl disable rebootechotime
vim /etc/rc.d/rc.local
在最后面加入
nohup /usr/local/WF/rebootechotime.sh &
exit 0
或
/usr/local/WF/rebootechotime.sh
解析:
- 在 /etc/rc.local 文件中,你可以使用
nohup
命令和&
符号将脚本放到后台执行。nohup
命令用于运行一个命令,使其在你退出 shell 后继续运行。&
符号则用于将命令放到后台执行。 - 在Linux的shell脚本和初始化文件中,
exit 0
通常用来表示脚本或程序已成功完成。exit 命令用于结束脚本的执行,并返回一个退出状态码给父进程。退出状态码是一个整数,通常用于向调用者指示脚本的执行结果。exit 0:表示成功(没有错误)exit 1、exit 2 等非零值:表示有错误发生,不同的非零值可能表示不同类型的错误。
现在添加执行权限并重启测试一下:
chmod a+x /usr/local/WF/rebootechotime.sh
reboot
重启完后,查看一下rebootechotime.txt
cat /usr/local/WF/rebootechotime.txt
多了一条记录