linux开机自动执行命令和脚本 自动启动 自启 进程一直运行


sudo systemctl list-unit-files —type=service —state=enabled —all

方法一:简单的启动命令

直接在/etc/rc.local(/etc/rc.d/rc.local)文件中添加即可

ubuntu18.04不再使用initd管理系统,改用systemd

systemd默认读取/etc/systemd/system下的配置文件,该目录下的文件会链接/lib/systemd/system/下的文件,
一般系统安装完/lib/systemd/system/下会有rc-local.service文件,即我们需要的配置文件。

  • 链接服务脚本
1
ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
  • 查看文件内容
1
cd /etc/systemd/system/  cat rc-local.servicerc-local.service内容#  SPDX-License-Identifier: LGPL-2.1+  ##  This file is part of systemd.##  systemd is free software; you can redistribute it and/or modify it#  under the terms of the GNU Lesser General Public License as published by#  the Free Software Foundation; either version 2.1 of the License, or#  (at your option) any later version.# This unit gets pulled automatically into multi-user.target by# systemd-rc-local-generator if /etc/rc.local is executable.[Unit]  Description=/etc/rc.local Compatibility  Documentation=man:systemd-rc-local-generator(8)  ConditionFileIsExecutable=/etc/rc.local  After=network.target[Service]  Type=forkingExecStart=/etc/rc.local startTimeoutSec=0  RemainAfterExit=yesGuessMainPID=no  [Install]  WantedBy=multi-user.targetAlias=rc-local.service
  1. [Unit] 区块:启动顺序与依赖关系。
  2. [Service] 区块:启动行为,如何启动,启动类型。
  3. [Install] 区块,定义如何安装这个配置文件,即怎样做到开机启动。
  • 创建/etc/rc.local文件
1
touch /etc/rc.local
  • 赋可执行权限
1
chmod 755 /etc/rc.local
  • 编辑rc.local,添加需要开机启动的任务

比如:

1
#!/bin/bash  echo "test rc " > /var/test.log

方法二:添加启动项

initd 启动管理系统中

  1. 在 /etc/init.d目录下建立启动脚本,这里建立了文件test

写入内容:(最好先阅读目录下的README文件说明)
注意所以路径必须是绝对路径
注意需要有LSB 头部,即那一大堆注释,格式参考openSUSE:Packaging init scripts

1
#!/bin/bash### BEGIN INIT INFO# Provides:          Neucrack# Required-Start:    $remote_fs $syslog $network $named# Required-Stop:     $remote_fs $syslog $network # Should-Start:      $network $portmap# Should-Stop:       $network $portmap# X-Start-Before:    nis# X-Stop-After:      nis# Default-Start:     3 5# Default-Stop:      0 1 2 4 6# X-Interactive:     true# Short-Description: ss auto start script# Description:       shadowsocks auto start script,#                    This file should be used to construct scripts to be#                    placed in /etc/init.d.### END INIT INFOcase "$1" in    start)        /home/neucrack/software/ss/start_kcptun_client.sh        /home/neucrack/software/ss/start_ss_local.sh        rc_status -v        ;;    stop)        /home/neucrack/software/ss/stop_ss_local.sh        /home/neucrack/software/ss/stop_kcptun_client.sh        rc_status -v        ;;    restart)        $0 stop        $0 start        rc_status        ;;    *)        echo "Usage: $0 {start|stop|restart}"        exit 1        ;;esac

上面这脚本实际上在使用时出现了问题,/home/neucrack/software/ss/start_ss_local.sh这个命令始终没有被执行,原因是/home/neucrack/software/ss/start_kcptun_client.sh中的命令阻塞了进程,导致后面一句始终没有执行,可以将他们分别放到后台执行就行了,如何在后台执行可以看文章最后一部分

1
(/home/neucrack/software/ss/start_kcptun_client.sh &) (/home/neucrack/software/ss/start_ss_local.sh &)
  1. 设置脚本文件的执行权限
1
$ sudo chmod +x  /etc/init.d/test
  1. 使用update-rc.d 命令将脚本放到启动脚本中去(debian中可以使用更新的insserv):
1
$ cd /etc/init.d$ sudo update-rc.d test defaults 95

注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。更多说明建议看man update-rc.d。

也可以自己手动在rc*.d中建立软连接

1
$ ls -s test ../rc5.d/S95test

这里的rc*.d,*代表启动级别,在不同启动级别启动,K开头的脚本文件代表运行级别加载时需要关闭的,S开头的代表相应级别启动时需要执行,数字代表顺序

  1. 卸载启动脚本的方法:
1
$ cd /etc/init.d$ sudo update-rc.d -f test remove
  1. 开机会自动自动,也可以手动调用
1
/etc/init.d/test start/etc/init.d/test stop/etc/init.d/test restart

在 systemd 服务管理系统中

要添加一个 systemd 服务, 需要:
在/usr/lib/systemd/system 或者 /etc/systemd/system 目录下新建文件, 比如前面说过的rc-local.service, 然后编写内容比如 sshd:

1
[Unit]Description=OpenSSH server daemonDocumentation=man:sshd(8) man:sshd_config(5)After=network.target sshd-keygen.serviceWants=sshd-keygen.service[Service]Type=notifyEnvironmentFile=/etc/sysconfig/sshdExecStart=/usr/sbin/sshd -D $OPTIONSExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.target

这里有几个模块:

  1. [Unit] 区块:启动顺序与依赖关系。
  2. [Service] 区块:启动行为,如何启动,启动类型。
  3. [Install] 区块,定义如何安装这个配置文件,即怎样做到开机启动。

详细的参数看手册

systemd 服务常用命令(以 mysql 举例):

1
# 开机启动systemctl enable mysqld# 关闭开机启动systemctl disable mysqld# 启动服务systemctl start mysqld# 停止服务systemctl stop mysqld# 重启服务systemctl restart mysqld# 查看服务状态systemctl status mysqldsystemctl is-active sshd.service# 结束服务进程(服务无法停止时)systemctl kill mysqld

方法三:在redhat,centos等系统中还可以使用chckconfig来设置自动启动的服务

桌面系统自动启动

桌面系统搜索 启动 ,打开启动管理器 添加删除即可
启动管理器

实用:用户退出后仍然运行该进程的方法(一般用在需要一直运行的进程,比如一个git服务器的进程,在创建后只要没关机都应该在运行,这个时候就需要这个功能):

一般有以下几种方法:

1)在输入命令的最前面加上nohup命令

如nohup your_command & 这样命令在你退出后仍然会在后台执行

2)setsid命令

setsid your_command该命令的结果是使你所运行的命令的父进程为init,所以只有关机该进程才会停止

3)(your_command &)

就是用括号将你的命令括起来,这样做也是使命令的父进程为init

4)disown

当你在命令行下输入your_command &后命令就在后台执行了,然后执行jobs命令,该命令会列出当前正在后台执行的命令。例如输入命令“top&”
然后执行”jobs”
输出结果是
[1] + Suspended (tty output) top
注意行开头方括号内的数字,该数字叫做jobspec,是给当前后台运行的job的编号。这是你只要在命令行下输入”disown -h 1” 后台运行的top命令就不会受到hangup信号的影响了。

5)使用screen命令

在命令行下输入screen命令就开启了一个screen进程,它就好像是一个全新的命令运行环境,在该环境中你可以像在正常的terminal下那样执行
命令,但是这个screen是不受其父进程的hangup信号的影响的,既然screen不受其父进程影响,当你意外掉线或者退出系统时,在screen
中仍在执行的命令仍然会继续执行。关于screen命令的使用方法你可以再去查阅相关资料。