一、shell脚本命令形式——开机自启
此方法无法防止崩溃后自启
1、创建shell开机自执行脚本
在root权限(防止保存不了.sh文件)下在/etc/profile.d下面创建.sh脚本文件,在文件里编写所需执行的命令,下面powerOn-script是你的文件名:
su
nano /ect/profile.d/powerOn-script.sh
进入该.sh文件中编辑所需命令时,若第一行开头会有切换某文件夹的命令时,可用source代替cd,因为cd会开启子进程,source在当前进程。
可以在一个文件中连写多个服务的命令,如果某项服务出现问题,可以单独再创建一个.sh文件写如该服务命令,比如:
source /etc/某文件夹
python.py
cd /某文件夹
nginx -s reload
注意:为了能保证正常执行切换文件目录的命令,可以用绝对完整路径。
2、给予权限
编辑完该shell脚本并保存之后,用chmod命令给其最大权限,比如:
chmod 777 /etc/profile.d/powerOn-script.sh
3、测试和查看服务状态
先测试执行下所写脚本内容是否有误,然后再重启计算机实验,开机后可以用该命令查看当前所有的服务,+号代表运行中,-号为未运行,比如:
service --status-all
停止某服务。
service appache stop
单独查看某服务状态。在所显示的参数中,第一行的第一个disable(开机自启动关闭)或enable(开机自启动开启)
systemctl status nginx
二、systemctl服务形式——崩溃+开机自启
此方法可以开机自启,也可以崩溃或杀死进程后自启
1.在/etc/systemd/system/下创建创建后缀名为service的文件
vi /etc/systemd/system/文件名.service
以下是文件的内容的两个例子(自测有效):
注意:若是没有必须要手动进入的目录命令时,只写脚本执行命令就好
1、原本手动执行的命令为:
cd /usr/dj/api/
nohup dji8 &
写入service文件后:
[Unit]
Description=api
[Service]
Type=forking
User=root # 用户名
WorkingDirectory=/usr/dj/api # 文件执行时的绝对路径
ExecStart=nohup /usr/dj/api/dji8 & # nohup 文件执行时的绝对路径+空格+启动执行的命令
ExecReload=nohup /usr/dj/api/dji8 & # nohup 文件执行时的绝对路径+空格+重启执行的命令
Restart=always # 总是重启
RestartSec=5 # 5秒后重启
[Install]
WantedBy=multi-user.target
2、原本手动执行的命令为:
nginx -s reload
写入service文件后:
[Unit]
Description=nginx
[Service]
Type=forking
User=root # 用户名
WorkingDirectory=/ # 文件执行时的绝对路径
ExecStart=service nginx start # nohup 文件执行时的绝对路径+空格+启动执行的命令
ExecReload=nginx -s reload # nohup 文件执行时的绝对路径+空格+重启执行的命令
Restart=always # 总是重启
RestartSec=5 # 5秒后重启
[Install]
WantedBy=multi-user.target
service文件的详细配置项
Description:描述和内容。
user:服务的用户名。
WorkingDirectory:服务的绝对安装目录。
Description:服务的简单描述。
Documentation:文档位置。
After:在什么服务之后启动。
Before:在什么服务之前启动。 After和Before字段只涉及启动顺序,不涉及依赖关系。
Wants:该服务和某服务存在某种弱依赖关系,即某服务停止运行或退出不影响该服务继续运行。
Requires:表示“强依赖”关系,即某服务停止运行或退出,改服务也必须停止运行。
Wants与Requires只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
Type:定义启动类型。它的值有:
- simple(默认值):ExecStart字段启动的进程为主进程。
- forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程。
- oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务。
- dbus:类似于simple,但会等待 D-Bus 信号后启动。
- notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务。
-idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混。
ExecStart:定义启动进程时执行的命令,就是手动启动时执行的命令。它的值有:
- ExecReload字段:重启服务时执行的命令。
- ExecStop字段:停止服务时执行的命令。
- ExecStartPre字段:启动服务之前执行的命令。
- ExecStartPost字段:启动服务之后执行的命令。
- ExecStopPost字段:停止服务之后执行的命令。
KillMode:定义 Systemd 如何停止 sshd 服务。它的值有:
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉。
- process:只杀主进程。
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号。
- none:没有进程会被杀掉,只是执行服务的 stop 命令。
Restart字段:定义了sshd退出后,Systemd 的重启方式,对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal。它的值有:
- no(默认值):退出后不会重启。
- on-success:只有正常退出时(退出状态码为0),才会重启。
- on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启。
- on-abnormal:只有被信号终止和超时,才会重启。
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启。
- on-watchdog:超时退出,才会重启。
- always:不管是什么退出原因,总是重启。
WantedBy:该服务所在的 Target。Target表示一组服务。Systemd 有默认的启动 Target是multi-user.target,在这个组里的所有服务,都将开机启动。查看 multi-user.target 包含的所有服务命令:systemctl list-dependencies multi-user.target。
2.保存文件之后执行该命令使服务配置文件生效 : systemctl daemon-reload
3.开启服务:systemctl start 文件名.service
4.查看此服务状态:systemctl status 文件名.service
在此状态下:
Loaded:第一个项是开机是否启动状态,enable(开机启动开启),disble(开机启动关闭)。
Active:有几个状态分别是:
active(running):程序正在执行;
atcive(exited):执行一次就正常退出的服务,不在系统中执行任何程序;
active(waiting):正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行;
inactive (dead):未启动状态;
Main PID:主进程ID
开启开机自启动:systemctl enable 文件名.service
关闭开机自启动:systemctl disable 文件名.service
关闭服务:systemctl stop 文件名.service
三、linux开启服务并重启后无法进入计算机问题
提示:不必着急,都可以解决
若是ubuntu系统
1、按住alt键,并依次按prtsc、r、e、i、s、u、b键,可以看到屏幕出现四个选项。
2、选择第二个Advanced options for Ubuntu选项,按回车继续后又会看到四个选项,选择任何一个带有recovery mode字样的选项,在下一个彩色界面选择root进入命令行界面,输入root密码,就可以使用命令行了。
3、找到你所编辑的文件,试着修改其中的内容选项,或者用“#”号一行行注注销所编辑的内容,然后用reboot命令尝试重启。
注意:不要去直接删除.service文件,因为有可能在会在重启的时候会报找不到这个文件的错误,如果你已经删除了这个文件,可以在相同位置创建一个同名的.service文件,里面不需要添加任何内容,然后尝试重启。