linux开机自启动

摘要:
在使用Linux的过程中,我们经常遇到需要设置一个自定义应用程序以自动启动以节省操作时间。这里有两种方法可以自动设置引导/bin/sh-e##rc.local##此脚本在多用户运行级别下执行。#确保脚本在成功或其他#valueoner错误时“退出0”。##要启用或禁用脚本,只需更改执行#位。##默认情况下,此脚本不起作用。它不包括其他内容。用户可以添加要在启动时执行的脚本命令。以diodon粘贴板工具为例。如果我想启动并运行diodon进程,请在文本中添加以下内容:downey@ubuntu:~$cat/etc/rc。本地#!/垃圾桶/垃圾桶/usr/bin/diodon将其命名为diodon。sh,然后使用命令:chmod+xdiodon。shsudocpdiodon。sh/etc/init。d/将文件放在/etc/init目录中。d、 然后将diodon和sh脚本链接到引导运行序列:cd/etc/init。dsu输出rc。ddiodon Shdefaults96inserv:warning:脚本“dioon”缺少LSB标记和覆盖当您重新启动时,您可以看到dioon。sh正在运行。
linux下添加简单的开机自启动脚本

在linux的使用过程中,我们经常会碰到需要将某个自定义的应用程序设置为开机自启动以节省操作时间,这里提供两个设置开机自启动的方法。

注:博主使用的ubuntu-16.04进行实验,其它版本可能有偏差,但实现原理类似。

rc.local

在rc.local脚本中添加开机自启动程序

ubuntu在开机过程之后,会执行/etc/rc.local(注意/etc/init.d中也有个rc.local,不要弄混了)文件中的脚本程序,初始情况下,这个文件内容是这样的:

downey@ubuntu:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.  

并不包含其它内容,用户可以在里面添加需要开机执行的脚本命令,这里以diodon粘贴板工具为例,如果我要开机运行diodon进程,在文本中添加:

downey@ubuntu:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
./usr/bin/diodon &
exit 0

看到这里有些盆友就要问了,为什么要在执行命令后面加&?

在shell执行命令后加&是为了让应用程序在后台运行,rc.local也是一个脚本,主进程在运行这个脚本时必须能够返回,如果在这个脚本里面执行了一些死循环或者其他无法返回的任务,整个系统就很可能卡死在这里,无法启动,所以在这里运行的用户程序必须是能够返回或者本身就使用一些后台运行的进程。

经过上面的添加,在下次重启的时候,使用命令:

downey@ubuntu:~$ ps -ef |grep "diodon"
downey     2097   1880  0 22:53 ?        00:00:04 diodon
downey     2937   2842  0 23:27 pts/2    00:00:00 grep --color=auto diodon  

就可以看到diodon进程已经在后台运行。

删除

既然有添加,就必须得有删除,其实以rc.local的删除方式很简单,直接删除rc.local中用户添加的部分即可。

需要提醒的是,在操作系统文件时,做备份是非常必要的

将用户脚本添加到/etc/init.d中

添加用户进程

第二种方式就是将自己的用户脚本添加到/etc/init.d并链接到自启动程序当中。

还是以diodon软件来举例,我编辑一个运行diodon的脚本:

#!/bin/bash
./usr/bin/diodon  

将其命名为diodon.sh,并用指令:

chmod +x diodon.sh
sudo cp diodon.sh /etc/init.d/  

将文件放到/etc/init.d目录中,然后将diodon,sh脚本链接到开机运行序列中:

cd /etc/init.d
sudo update-rc.d diodon.sh defaults 96
insserv: warning: script 'diodon' missing LSB tags and overrides  

这样重新启动时,就可以看到diodon.sh正在运行了。
sudo update-rc.d diodon.sh defaults 96
在这条指令中,update-rc.d是一个系统的链接工具。

defaults 96则是指定了脚本的开机顺序,数字为0-99,数字越大执行优先级越低,用户添加的程序最好选择低优先级的执行顺序,因为很可能我们的用户程序会依赖一些系统的应用进程,例如如果应用程序要使用到网络部分,就先得让网络后台程序先初始化完毕。

看到这里,细心的朋友已经发现了,在链接脚本时有一个警告:

insserv: warning: script 'diodon' missing LSB tags and overrides  

作为一个菜鸟而言,是不敢忽视任何警告的,所以只好求助google,解决办法是在自己的脚本中的#!/bin/bash下添加:

### BEGIN INIT INFO
# Provides:          downey
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat service
# Description:       tomcat service daemon
### END INIT INFO  

添加这些的目的是告诉系统一些关于这个启动脚本的具体信息,其中比较重要的有这几项:

# Required-Start:   运行这个脚本需要的环境
# Required-Start:   停止这个脚本需要的环境
# Default-Start:    提供运行的运行级别
# Default-Stop:     不运行的运行级别
# Description:      描述

关于linux下的运行级别参考:linux运行级别

删除用户进程

既然有添加就必然有删除,如果需要删除自定义开机运行脚本,输入:

sudo update-rc.d -f diodon remove

systemd的开机自启动

上面提到的两种方式适用于经典的system V控制系统启动和关闭的情况,但是目前(2018年10月)在大多数发行版上都开始使用了systemd的系统软件控制方式,包括Ubuntu16,centos.systemd系统管理着linux下的进程运行,属于应用程序,不属于linux内核的范畴。

在systemd系统上设置开机自启动的方式也是非常简单的(尽管systemd这套软件管理工具并不简单)。

确定系统是否应用了systemd工具来管理

这里要注意的是,systemd是linux发行版上的预装工具,用来管理系统软件的启动运行和结束,所以通常来说,这套东西是依赖于发行版的,如果系统使用了这一套工具,那么就可以使用它来管理进程,如果不是,即使你安装了它,它也不会被默认配置为系统管理工具。

查看系统是否使用systemd工具我们可以使用如下的指令:

systemd --version

如果系统返回如下类似的信息,表明该系统是由systemd工具来管理软件:

systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN

systemctl的使用

对软件的管理主要是同通过systemd工具中的systemctl命令,相比于之前的system V的控制方式,systemd显得更加简洁明了,对用户更加友好,拿httpd来举例:

开启httpd服务:
sudo systemctl start httpd
设置httpd服务自启动:
sudo systemctl enable httpd

至于关闭和取消自启动,大家心里应该有数了吧。

设置开机自启动

我们再回到重点,设置开机自启动。

我们要为目标设置一个配置文件,其实这是可以预想到的,linux作为一个复杂的系统,开机自启动涉及到的依赖、运行级别、运行环境等等问题肯定需要用户去指定,在启动的时候系统才知道怎么正确地去运行软件。这个配置文件固定以.service作为后缀,比如我们如果要运行/home/downey目录下的test.sh脚本,我们可以添加一个配置文件test.service:

[Unit]
Description=
Documentation=
After=network.target
Wants=
Requires=

[Service]
ExecStart=/home/downey/test.sh
ExecStop=
ExecReload=/home/downey/test.sh
Type=simple

[Install]
WantedBy=multi-user.target

将文件放在/usr/lib/systemd/system 或者 /etc/systemd/system目录下,然后可以测试一下:

sudo systemctl start test.service  

然后你可以查看你的/home/downey/test.sh脚本是否已经运行,如果已经运行表示配置文件没有问题。然后可以键入:

sudo systemctl enable test.service  

设置test脚本开机启动。如果上一步没有出问题,这一步基本上也不会有什么问题,系统会打印出如下信息:

Created symlink /etc/systemd/system/multi-user.target.wants/test.service → /usr/lib/systemd/system/test.service.  

可以看到,这里在/etc/systemd/system/multi-user.target.wants/目录下创建了一个/usr/lib/systemd/system/test.service文件的软链接,到这里设置开机自启动就完成了。

配置文件的简单解析

在上面的配置文件中,为了演示起见,我将一些本测试脚本不需要但是比较重要的配置项也写了出来,其实如果不需要可以删除,但是[Unit]/[Service]/[Install]这三个标签需要保留。
我们来一个个简单介绍一下配置项:

Description:运行软件描述
Documentation:软件的文档
After:因为软件的启动通常依赖于其他软件,这里是指定在哪个服务被启动之后再启动,设置优先级
Wants:弱依赖于某个服务,目标服务的运行状态可以影响到本软件但不会决定本软件运行状态
Requires:强依赖某个服务,目标服务的状态可以决定本软件运行。
ExecStart:执行命令
ExecStop:停止执行命令
ExecReload:重启时的命令
Type:软件运行方式,默认为simple
WantedBy:这里相当于设置软件,选择运行在linux的哪个运行级别,只是在systemd中不在有运行级别概念,但是这里权当这么理解。  

如果有多项,用逗号作为分隔。

好了,关于linux开机自启动脚本就到此为止啦,如果朋友们对于这个有什么疑问或者发现有文章中有什么错误,欢迎留言

原创博客,转载请注明出处!

祝各位早日实现项目丛中过,bug不沾身.

免责声明:文章转载自《linux开机自启动》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一文读懂内存对齐的规则和作用几种开源分词工具的比較下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

100道linux运维笔试题

一百道Linux笔试题   1. cron 后台常驻程序 (daemon) 用于:  A. 负责文件在网络中的共享  B. 管理打印子系统 C. 跟踪管理系统信息和错误  D. 管理系统日常任务的调度 2. 在大多数Linux发行版本中,以下哪个属于块设备 (block devices) ? A. 串行口 B. 硬盘  C. 虚拟终端 D. 打印机 3...

zabbix监控磁盘IO

我这里有两种方法,感觉都不错。我这里主要是写一下监控的脚本。 1、使用iostat命令监控 1)首先打开配置文件的自定义脚本功能,然后编写脚本。 #!/bin/bash if [ $# -ne 1 ];then echo "Follow the script name with an argument" fi case $1 in...

Linux上Mysql安装总结

本次安装的是mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz版本 shell> groupadd mysql #增加组shell> useradd -r -g mysql mysql #增加用户,并将用户加入到mysql组中shell> tar zxvf /path/mysql-5.7.10-linux-...

Oracle AWR报告自动生成并ftp脚本

脚本主要由以下几个部分组成: awr.sql 用来在sqlplus 中执行的脚本,该脚本从网上直接找的。 awr.sh 用来调用sqlplus来生成awr报告。 ftp.sh 用来打包压缩每天生成的awr报告(压缩率大于50倍),并进行ftp传输,清理过期的报告,对于linux和solaris略有不同。 crontab 用来执行定时任务,根据需求进行调整。...

在Linux下执行Jmeter脚本

前言 Jmeter这款接口测试工具,已经在越来越多的公司被要求会使用了。 而且,现在应该部分小伙伴们都开始用起来了。 但是,你们知道除了在Windows用图形化界面的Jmeter执行脚本之外,还有其他可以执行的方法吗?? 今天就来告诉你们,如何在Linux服务器里执行Jmeter的jmx。 前提准备: 1.Linux下安装好JDK 2.在Windows下使...

Linux实时查看日志,访问前10IP 和相关命令

Nginx日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问次数。 既然是统计,那么awk是必不可少的,好用而高效。 命令如下: awk '{a[$1] += 1;} END {for (i in a) printf("%d %s ", a[i], i);}' 日志文件 | sort -n | tail 首先用awk统...