zhaoyu@home:~$

linux命令-服务自动启动

centOS6

Linux下配置某个服务的开机自启动,分为两种情况:一种是已经挂载的,另一种是未挂载的。已经挂载的程序可以使用 chkconfig命令 查到运行等级,如httpd服务
执行命令:

chkconfig  --list |grep httpd

打印信息:

httpd  0:off    1:off 2:off   3:off  4:off   5:off   6:off

未挂载的程序,不会打印任何信息,如Tomcat
执行chkconfig --list |grep tomcat,没有打印任何信息

已挂载程序开机自启动

以httpd服务举例,在root用户下打开一个终端。执行命令:

chkconfig  --list |grep httpd 

可以看到0~6都是off。
执行命令:

chkcongfig httpd on

执行命令:

chkconfig  --list |grep httpd 

执行完chkcongfig httpd on后,2~5对应的值变成了on.

此时我们通过service httpd status 查看http服务状态,是stopped状态,没有开机自启动,此时我们重启Linux电脑,再来查看httpd服务 是否开机启动:

service httpd status

可以看到httpd服务已经启动

LINUX运行等级

执行chkcongfig httpd on 可以加–level参数,指定将0~6哪些级别开启,命令格式如下:

# chkcongfig  --level   345  httpd on 

345就是需要开启(由off变成on)的数字,而不加—level参数时,默认打开的是2~5
0~6对应的运行级别如下:
Linux系统有7个运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

未挂载程序开机自启动

未挂载的程序开机自启动实现方式是编写程序启动的.sh脚本,再将此脚本挂载到Linux系统上,让它开机执行,启动程序。
实现方式有两种:简易版和完全版

简易版

以Tomcat服务为例,步骤如下:

  • 编写脚本start.sh
    位置为/app/start.sh, 可自定义脚本位置和脚本名字,此处的app只是作者在根目录下自建的一个文件夹。 脚本内容为:
    #!/bin/bash
    export JDK_HOME=/app/jdk1.7.0_71
    export JAVA_HOME=/app/jdk1.7.0_71
    /app/bim/apache-tomcat-7.0.63/bin/startup.sh
    
  • 给脚本赋执行权限。
    chmod +x /app/start.sh
    
  • 给/etc/rc.d/rc.local文件赋执行权限
    chmod +x /etc/rc.d/rc.local
    
  • 打开/etc/rc.d/rc.local文件,在最后加上如下脚本:
    /app/start.sh
    
  • 重启服务器后,使用命令查看tomcat是否自动启动。
    ps -ef |grep tomcat 
    
完全版
  • 编写shell脚本
    在/etc/init.d下新建一个文件tomcat,打开,添加如下内容: ``` #!/bin/sh

    Tomcat auto-start

    RETVAL=0 export JAVA_HOME=/app/jdk1.7.0_71 export JRE_HOME=/app/jdk1.7.0_71/jre export CATALINA_HOME=/app/bim/apache-tomcat-7.0.63 export CATALINA_BASE=/app/bim/apache-tomcat-7.0.63 start() { if [ -f $CATALINA_HOME/bin/startup.sh ]; then echo $”Starting Tomcat” $CATALINA_HOME/bin/startup.sh RETVAL=$? echo “ OK” return $RETVAL fi } stop() { if [ -f $CATALINA_HOME/bin/shutdown.sh ]; then echo $”Stopping Tomcat” $CATALINA_HOME/bin/shutdown.sh RETVAL=$? sleep 1 ps -fwwu root | grep tomcat|grep -v grep | grep -v PID | awk ‘{print $2}’|xargs kill -9 echo “ OK” # [ $RETVAL -eq 0 ] && rm -f /var/lock/… return $RETVAL fi }

case “$1” in start)
start ;; stop)
stop ;;

restart) echo $”Restaring Tomcat” $0 stop sleep 1 $0 start ;; *) echo $”Usage: $0 {start|stop|restart}” exit 1 ;; esac exit $RETVAL


* 给脚本增加可执行权限

chmod +x /etc/init.d/tomcat

* 挂载,执行命令:

ln -s /etc/init.d/tomcat /etc/rc2.d/S16Tomcat

* 设置开机自启动,执行命令

chkconfig –add tomcat

此时我们使用`chkconfig  --list |grep tomcat`命令,可以发现Tomcat加入了chkconfig,也就能通过修改其运行等级来实现开机
启动与否。而且Tomcat可以使用service tomcat start/stop/restart命令进行开启/关闭/重启。     
重启电脑,验证Tomcat是否开机重启。

### CentOS7
centos 7以上是用Systemd进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 
固有的缺点,提高系统的启动速度。        
Systemd服务文件以.service结尾,比如现在要建立nginx为开机启动,如果用yum install命令安装的,yum命令会自动创建nginx.service
文件,直接用命令。

systemctl enable nginx.service

设置开机启动即可。 

如果是用源码编译安装的,要手动创建nginx.service服务文件。
* 创建服务文件            
在系统服务目录`/lib/systemd/system/`里创建nginx.service文件。内容如下:

[Unit] Description=nginx After=network.target

[Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true

[Install] WantedBy=multi-user.target


Unit:服务的说明        
Description:描述服务        
After:描述服务类别        
Service:服务运行参数的设置       
Type=forking:后台运行的形式        
ExecStart:服务的具体运行命令     
ExecReload:重启命令,可选      
ExecStop:停止命令 ,可选       
PrivateTmp=True表示给服务分配独立的临时空间       

注意:Service的启动、重启、停止命令全部要求使用绝对路径       

Install运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

* 设置开机启动

systemctl enable nginx.service

* 重启配置

systemctl daemon-reload

* 重启系统后查看程序是否启动。

如果没有成功,可以使用journalctl命令查看日志。

journalctl -xe


#### tomcat自动启动
1. 在/lib/systemd/system下创建service

vi tomcat.service

1. 添加如下内容:

[Unit] Description=Tomcat After=network.target After=syslog.target

[Service] User=myuser #指定启动用户,默认为root Group=myuser #指定用户组

Type=forking PIDFile=/home/web/apache-tomcat-8.5.42/tomcat.pid ExecStart=/home/apache-tomcat-8.5.35/bin/catalina.sh start ExecReload=/home/apache-tomcat-8.5.35/bin/catalina.sh restart ExecStop=/home/apache-tomcat-8.5.35/bin/catalina.sh stop

[Install] WantedBy=multi-user.target

1. 配置catalina.sh        
其中PIDFile需要tomcat catalina.sh中配置CATALINA_PID选项,PID路径需要tomcat用户有读写权限。

CATALINA_PID= /home/web/apache-tomcat-8.5.42/tomcat.pid

1. 设置java_home      
catalina.sh会调用setclasspath.sh,在setclasspath.sh中设置JRE_HOME,否则启动会报找不到java_home的错误。

export JAVA_HOME=/usr/lib/java/jdk1.8.0_202 export JRE_HOME=/usr/lib/java/jdk1.8.0_202/jre export CATALINA_BASE=/home/web/apache-tomcat-8.5.42

1. 启用service:

systemctl enable tomcat.service

1. 重新加载服务配置

systemctl daemon-reload

#### JAR自动启动
1. 对jar执行文件添加启动脚本start.sh如下:

#!/bin/sh

添加java执行路径

export JAVA_HOME=/usr/lib/java/jdk1.8.0_202 export PATH=$JAVA_HOME/bin:$PATH cd dirname $0 nohup java -jar xxx.jar > service.log 2>&1 & echo $! > /var/run/xxx.pid

其中cd `dirname $0`标识cd到该脚本所在的路径,如果jar执行依赖相对路径下的一些配置,那么就需要执行此命令。
1. 对jar执行文件添加关闭脚本stop.sh如下:

#!/bin/sh PID=$(cat /var/run/xxx.pid) kill -9 $PID

1. 在/lib/systemd/system下创建service

vi xxx.service


1. 添加如下内容:

[Unit] Description=xxx After=network.target After=syslog.target

[Service] User=myuser #指定启动用户,默认为root Group=myuser #指定用户组

Type=forking ExecStart=/home/xxx/start.sh ExecStop=/home/xxx/stop.sh

[Install] WantedBy=multi-user.target

service的另一种配置方法,不需要编写sh脚本:利用systemd对jar的支持,直接配置jar包执行,systemd会自动管理pid,和重启restart,
关闭stop等。service中需要配置**绝对路径,相对路径会报错**。143是jar包执行成功返回的code。

[Unit] Description=question-8082 After=syslog.target After=network.target

[Service] User=root

ExecStart=/usr/bin/java -jar /root/question-8082.jar SuccessExitStatus=143

[Install] WantedBy=multi-user.target

1. 启用service:

systemctl enable xxx.service

1. 重新加载服务配置

systemctl daemon-reload

#### redis自动启动
1. 在/lib/systemd/system下创建service

vi redis.service

1. 添加如下内容:

[Unit] Description=redis After=network.target After=syslog.target

[Service] User=myuser #指定启动用户,默认为root Group=myuser #指定用户组

Type=forking ExecStart=/usr/lib/redis/bin/redis-server /usr/lib/redis/etc/redis.conf ExecStop=kill -INT cat /tmp/redis.pid

[Install] WantedBy=multi-user.target

1. 启用service:

systemctl enable redis.service

1. 重新加载服务配置

systemctl daemon-reload


#### nginx自动启动
1. 在/lib/systemd/system下创建service

vi nginx.service

1. 添加如下内容:

[Unit] Description=nginx After=network.target After=syslog.target

[Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit

[Install] WantedBy=multi-user.target

1. 启用service:

systemctl enable nginx.service

1. 重新加载服务配置

systemctl daemon-reload ```