Linux服务开机自启和崩溃后自启以及计算机无法重启的解决办法

一、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文件,里面不需要添加任何内容,然后尝试重启。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值