0、预备

( 请注意,本例基于 阿里云 云主机 完成所有,其它环境下可能略有不同 )

0.1、修改主机名称

在 Ubuntu 的终端中,默认在用户名之后显示的即为本机主机名称(形式为: 用户名@主机名称 )。

该名称被保存在 /etc/hostname 文件中,因此通过 cat 等命令查看该文件也可以返回本机主机名称:

root@iZj6c3z6cxj72pewvf2dcyZ:~# cat /etc/hostname
iZj6c3z6cxj72pewvf2dcyZ

通过修改 /etc/hostname 文件的内容即可修改主机名称(使用vi或vim等命令直接编辑即可):

root@iZj6c3z6cxj72pewvf2dcyZ:~# vi /etc/hostname

修改后保存并退出vi编辑器,重新查看文件内容:

root@iZj6c3z6cxj72pewvf2dcyZ:~# cat /etc/hostname
malajava

重新启动 Ubuntu :

root@iZj6c3z6cxj72pewvf2dcyZ:~# reboot

启动完成后,打开终端,即可看到主机名称已经更换成功:

root@malajava:~#
0.2、安装下载工具

Linux 平台下,有很多优秀的多线程下载工具,比如 wget 、axel 等,Ubuntu 一般自带 wget 。

这里,我们安装一个 Ubuntu 并没有内置的下载工具: axel 

root@malajava:~# apt-get update

root@malajava:~# apt-get install  axel

安装完成后就可以使用了,后续下载 jdk 和 tomcat 都将使用该工具。

0.3、物以类聚

从个人工作十年多经历来看,将软件、代码等分类存放可以降低记忆成本,提高工作和学习效率。

将软件、代码等分类存放也一直是我向同事和学生建议的。因此,这里做出以下约定:

  • /opt/software 目录中存放程序安装包、压缩包,比如 apache-tomcat-9.0.5.tar.gz。
  • /opt/jdk 目录中存放的是解压后的 JDK (也就是JDK安装目录)
  • /opt/web 目录中存放与 WEB 服务器有关的程序(解压后可以运行的),比如 tomcat 、nginx 等。
  • /opt/www 目录中存放 WEB 应用 ( 俗称网站 )

本文后续内容中涉及的目录或文件路径,都将遵循以上约定。

1、下载并解压JDK

关于JDK版本的选择,建议从 Oracle 官网下载最新版本。
另外,因为 Oracle 官网上仅仅给出了 JDK 1.9 的 64 位版,所以本文中依然使用 JDK 1.8 。

Oracle 官方下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

如果从 Oracle 官网下载失败,也可以从我的 malajava.io 下载,因为租用的是海外服务器因此速度可能会比较慢,这里提供三个下载链接:

这是本文采用的: 
64位Linux版: http://malajava.io/downloads/jdk-8u112-linux-x64.tar.gz

这是发文时最新版本:
32位Linux版: http://malajava.io/downloads/jdk-8u161-linux-i586.tar.gz
64位Linux版: http://malajava.io/downloads/jdk-8u161-linux-x64.tar.gz

如果你是在远程服务器上进行操作,建议从我的 malajava.io 下载。
如果你是在本地进行操作,可以从百度云盘下载(国内用户下载会比较快):

链接:https://pan.baidu.com/s/1kUSFchh 密码:ecjk

首先进入到 /opt/software 目录中:

root@malajava:~# cd /opt/software
root@malajava:/opt/software#

随后使用 axel 下载 JDK :

root@malajava:/opt/software# axel http://malajava.io/downloads/jdk-8u112-linux-x64.tar.gz

通常,Oracle会拒绝使用axel等工具下载(HTTP/1.0 403 Forbidden),因此这里选择从malajava.io下载。

下载完毕,可以通过 ls 查看该文件的相关信息:

root@malajava:/opt/software# ls -l jdk-8u112-linux-x64.tar.gz 
-rw-r--r-- 1 root root 183212596 Feb 19 01:33 jdk-8u112-linux-x64.tar.gz

随后将 jdk-8u112-linux-x64.tar.gz 解压到 /opt/jdk 目录中:

root@malajava:/opt/software# tar zxvf jdk-8u112-linux-x64.tar.gz -C /opt/jdk/

[ 这里的 tar 命令使用格式:  tar zxvf  压缩文件  -C  目标路径 ]

[ 注意,当前操作是在 /opt/software 目录下进行的,jdk-8u112-linux-x64.tar.gz 就在该目录中 ]

成功解压后,进入到 /opt/jdk 目录中,使用 mv 命令将 jdk1.8.0_112 重命名为 1.8.0_112 :

root@malajava:/opt/software# cd /opt/jdk
root@malajava:/opt/jdk# ls -l
total 4
drwxr-xr-x 8 uucp  143 4096 Sep 23  2016 jdk1.8.0_112

root@malajava:/opt/jdk# mv jdk1.8.0_112 1.8.0_112

root@malajava:/opt/jdk# ls -l
total 4
drwxr-xr-x 8 uucp  143 4096 Sep 23  2016 1.8.0_112

[ 这里使用 mv 重命名的使用方式:  mv  原来的文件名或目录名    修改后的文件名或目录名 ]

[ 将 jdk1.8.0_112 重命名为 1.8.0_112 并不是必须的,只是沿用了我以前的工作习惯 ]

请注意,此时的 /opt/jdk/1.8.0_112 就是JDK的安装目录了,也是将来环境变量中JAVA_HOME变量的值。

以上操作完成后,接下来,我们修改 /opt/jdk/1.8.0_112 目录的属主( owner )及分组( group ):

root@malajava:/opt/jdk# ls -l
total 4
drwxr-xr-x 8 uucp  143 4096 Sep 23  2016 1.8.0_112

root@malajava:/opt/jdk# chown -R root:root 1.8.0_112

root@malajava:/opt/jdk# ls -l
total 4
drwxr-xr-x 8 root root 4096 Sep 23  2016 1.8.0_112
root@malajava:/opt/jdk# ls -l 1.8.0_112/
total 25920
drwxr-xr-x 2 root root     4096 Sep 23  2016 bin
-r--r--r-- 1 root root     3244 Sep 23  2016 COPYRIGHT
drwxr-xr-x 4 root root     4096 Sep 23  2016 db
drwxr-xr-x 3 root root     4096 Sep 23  2016 include
-rwxr-xr-x 1 root root  5094021 Sep 23  2016 javafx-src.zip
drwxr-xr-x 5 root root     4096 Sep 23  2016 jre
drwxr-xr-x 5 root root     4096 Sep 23  2016 lib
-r--r--r-- 1 root root       40 Sep 23  2016 LICENSE
drwxr-xr-x 4 root root     4096 Sep 23  2016 man
-r--r--r-- 1 root root      159 Sep 23  2016 README.html
-rw-r--r-- 1 root root      526 Sep 23  2016 release
-rw-r--r-- 1 root root 21112816 Sep 23  2016 src.zip
-rwxr-xr-x 1 root root   110114 Sep 23  2016 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 1 root root   177094 Sep 23  2016 THIRDPARTYLICENSEREADME.txt

[ 这里的 chown 命令使用格式:  chown -R 属主:分组  目录名 ]

[ 选项-R表示递归(recursion),即将被修改目录中的文件及子目录、子目录中的文件及子目录 ... 都做修改 ]

接下来,建议修改 /opt/jdk/1.8.0_112 目录以及其各级子目录中每个文件的权限:

root@malajava:/opt/jdk# chmod -R 755 1.8.0_112
root@malajava:/opt/jdk# ls -l
total 4
drwxr-xr-x 8 root root 4096 Sep 23  2016 1.8.0_112
root@malajava:/opt/jdk# ls -l 1.8.0_112/
total 25920
drwxr-xr-x 2 root root     4096 Sep 23  2016 bin
-rwxr-xr-x 1 root root     3244 Sep 23  2016 COPYRIGHT
drwxr-xr-x 4 root root     4096 Sep 23  2016 db
drwxr-xr-x 3 root root     4096 Sep 23  2016 include
-rwxr-xr-x 1 root root  5094021 Sep 23  2016 javafx-src.zip
drwxr-xr-x 5 root root     4096 Sep 23  2016 jre
drwxr-xr-x 5 root root     4096 Sep 23  2016 lib
-rwxr-xr-x 1 root root       40 Sep 23  2016 LICENSE
drwxr-xr-x 4 root root     4096 Sep 23  2016 man
-rwxr-xr-x 1 root root      159 Sep 23  2016 README.html
-rwxr-xr-x 1 root root      526 Sep 23  2016 release
-rwxr-xr-x 1 root root 21112816 Sep 23  2016 src.zip
-rwxr-xr-x 1 root root   110114 Sep 23  2016 THIRDPARTYLICENSEREADME-JAVAFX.txt
-rwxr-xr-x 1 root root   177094 Sep 23  2016 THIRDPARTYLICENSEREADME.txt

[ 这里的 chmod 命令使用格式:  chmod  -R  权限  目录名 ]

[ 选项-R表示递归(recursion),即将被修改目录中的文件及子目录、子目录中的文件及子目录 ... 都做修改 ]

其中,755 表示 rwx r-x r-x 权限 ( r=4 , w=2 , x=1 ),为了偷懒,将该目录中所有文件的权限都修改了。

**2、下载并解压Tomcat **

这么些年,好多国外的技术站点都被"墙"了,不过还好,国内尚能访问 apache 官网。
正所谓 "大道五十,天衍四九,人遁其一" (《周易.系辞上传》) ,我们尚有一线生机!

好了,言归正传,从 apache 官网下载最新版本 tomcat ,首先进入 tomcat 官网: tomcat.apache.org 
然后在左侧的 Download 标题下点击相应版本的 tomcat ,比如 Tomcat 9 ,进入 Tomcat 9 下载页面。
在新打开的页面中找到类似下图所示的区域:

ubuntu reboot之后多久能连接_操作系统

随后在 Binary Distributions 下放找到 Core 下的 tar.gz ,点击鼠标右键,选择 "复制链接地址" 。

之后在 Ubuntu 终端中进入到 /opt/software 目录 ( 之前约定过的 ):

root@malajava:~# cd /opt/software
root@malajava:/opt/software#

接下来,在 终端中先输入 axel ,再在之后 粘贴 刚刚复制的 链接地址,即可下载:

root@malajava:/opt/software# axel http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.5/bin/apache-tomcat-9.0.5.tar.gz

[ 注意,axel 命令 和 链接地址 之间是有空格的 !]

下载完成后,将刚下载的 .tar.gz 文件解压到 /opt/web 目录下 ( 之前约定过的 ):

root@malajava:/opt/software# tar zxvf apache-tomcat-9.0.5.tar.gz -C /opt/web/

进入到 /opt/web 目录并将 apache-tomcat-9.0.5 改名为 apache-tomcat :

root@malajava:/opt/software# cd /opt/web/
root@malajava:/opt/web# ls -l
total 4
drwxr-xr-x 9 root root 4096 Feb 19 01:39 apache-tomcat-9.0.5

root@malajava:/opt/web# mv apache-tomcat-9.0.5 apache-tomcat

root@malajava:/opt/web# ls -l
total 4
drwxr-xr-x 9 root root 4096 Feb 19 01:39 apache-tomcat
root@malajava:/opt/web# ls -l apache-tomcat
total 112
drwxr-x--- 2 root root  4096 Feb 20 23:47 bin
drwx------ 2 root root  4096 Feb  7 05:44 conf
drwxr-x--- 2 root root  4096 Feb 20 23:47 lib
-rw-r----- 1 root root 57092 Feb  7 05:44 LICENSE
drwxr-x--- 2 root root  4096 Feb  7 05:42 logs
-rw-r----- 1 root root  1804 Feb  7 05:44 NOTICE
-rw-r----- 1 root root  6851 Feb  7 05:44 RELEASE-NOTES
-rw-r----- 1 root root 16246 Feb  7 05:44 RUNNING.txt
drwxr-x--- 2 root root  4096 Feb 20 23:47 temp
drwxr-x--- 7 root root  4096 Feb  7 05:42 webapps
drwxr-x--- 2 root root  4096 Feb  7 05:42 work

[ 这里将 apache-tomcat-9.0.5 改名为 apache-tomcat 依然不是必须的,只是沿用了我以前的工作习惯 ]

如果 apache-tomcat 目录及其内部文件和子目录的属主不是 root ,分组不是 root ,使用以下命令修改:

root@malajava:/opt/web# chown -R root:root apache-tomcat

接下来,修改 /opt/web/apache-tomcat 目录以及其各级子目录中每个文件的权限:

root@malajava:/opt/web# chmod -R 755 apache-tomcat
root@malajava:/opt/web# ls -l
total 4
drwxr-xr-x 9 root root 4096 Feb 20 23:47 apache-tomcat
root@malajava:/opt/web# ls -l apache-tomcat
total 112
drwxr-xr-x 2 root root  4096 Feb 20 23:47 bin
drwxr-xr-x 2 root root  4096 Feb  7 05:44 conf
drwxr-xr-x 2 root root  4096 Feb 20 23:47 lib
-rwxr-xr-x 1 root root 57092 Feb  7 05:44 LICENSE
drwxr-xr-x 2 root root  4096 Feb  7 05:42 logs
-rwxr-xr-x 1 root root  1804 Feb  7 05:44 NOTICE
-rwxr-xr-x 1 root root  6851 Feb  7 05:44 RELEASE-NOTES
-rwxr-xr-x 1 root root 16246 Feb  7 05:44 RUNNING.txt
drwxr-xr-x 2 root root  4096 Feb 20 23:47 temp
drwxr-xr-x 7 root root  4096 Feb  7 05:42 webapps
drwxr-xr-x 2 root root  4096 Feb  7 05:42 work

3、配置环境变量

配置环境变量之前,回顾一下之前 JDK 及 Tomcat 的存放路径:

JDK安装目录为: /opt/jdk/1.8.0_112 ,该目录中内容如下:

root@malajava:~# ls -l /opt/jdk/1.8.0_112
total 25920
drwxr-xr-x 2 root root     4096 Sep 23  2016 bin
-r--r--r-- 1 root root     3244 Sep 23  2016 COPYRIGHT
drwxr-xr-x 4 root root     4096 Sep 23  2016 db
drwxr-xr-x 3 root root     4096 Sep 23  2016 include
-rwxr-xr-x 1 root root  5094021 Sep 23  2016 javafx-src.zip
drwxr-xr-x 5 root root     4096 Sep 23  2016 jre
drwxr-xr-x 5 root root     4096 Sep 23  2016 lib
-r--r--r-- 1 root root       40 Sep 23  2016 LICENSE
drwxr-xr-x 4 root root     4096 Sep 23  2016 man
-r--r--r-- 1 root root      159 Sep 23  2016 README.html
-rw-r--r-- 1 root root      526 Sep 23  2016 release
-rw-r--r-- 1 root root 21112816 Sep 23  2016 src.zip
-rwxr-xr-x 1 root root   110114 Sep 23  2016 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r-- 1 root root   177094 Sep 23  2016 THIRDPARTYLICENSEREADME.txt

Tomcat 安装目录为: /opt/web/apache-tomcat ,该目录中内容如下:

root@malajava:~# ls -l /opt/web/apache-tomcat
total 112
drwxr-x--- 2 root root  4096 Feb 19 01:39 bin
drwx------ 3 root root  4096 Feb 19 02:01 conf
drwxr-x--- 2 root root  4096 Feb 19 01:39 lib
-rw-r----- 1 root root 57092 Feb  7 05:44 LICENSE
drwxr-x--- 2 root root  4096 Feb 20 13:37 logs
-rw-r----- 1 root root  1804 Feb  7 05:44 NOTICE
-rw-r----- 1 root root  6851 Feb  7 05:44 RELEASE-NOTES
-rw-r----- 1 root root 16246 Feb  7 05:44 RUNNING.txt
drwxr-x--- 2 root root  4096 Feb 19 01:39 temp
drwxr-x--- 2 root root  4096 Feb 19 01:46 webapps
drwxr-x--- 3 root root  4096 Feb 19 01:57 work

使用 vi 编辑器修改 /etc/profile ( 确保拥有 root 权限的前提下 ):

root@malajava:~# vi /etc/profile

在 /etc/profile 末尾追加以下内容: 

export JAVA_HOME=/opt/jdk/1.8.0_112

export CATALINA_HOME=/opt/web/apache-tomcat

export PATH=.:$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH

export CLASSPATH=.

[ 这里需要强调的是 CLASSPATH ,如非特殊需要,它的取值只需要一个半角圆点 ,这里采用最简配置 ]

[ 作为一个初学者或者并无特殊需要的前提下,并没有必要为 CLASSPATH 取值追加其它内容 ]

[ 若写作 CLASSPATH=.:$JAVA_HOME/lib/tools.jar;$JAVA_HOME/lib/dt.jar 纯属画蛇添足 ]

注意:

  • Linux 环境下,引用某个已经存在的环境变量使用 "$变量名" 的形式,比如  $JAVA_HOME
  • 环境变量的取值可能包含多个部分,在Linux环境下,不同部分之间使用 : 分隔 ( 注意是半角冒号 )

配置环境变量之后,需要先让环境变量生效:

  • 注销用户或重启系统可以让全局范围内都生效
  • 使用 source 命令,让环境变量仅仅在当前终端中生效

这里,暂不重启 Ubuntu ( 因为是远程登录嘛,重启还需要重新链接 ),而是使用 source 命令:

root@malajava:~# source /etc/profile
root@malajava:~#

随后即可在终端中通过执行 javac 和 java 命令的方式检验是否配置成功:

root@malajava:~# javac -version
javac 1.8.0_112

root@malajava:~# java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

当看到以上信息时,即表示环境变量中与Java有关的配置是正确的。

4、验证 Tomcat 配置是否正确

在终端中输入以下命令(注意在单词run之前有个半角空格):

root@malajava:~# catalina.sh run

如果按下回车键后看到的是以下提示:

root@malajava:~# catalina.sh run
catalina.sh: command not found

则表示环境变量中的 CATALINA_HOME 对应的路径是不正确的,请仔细检查并更改正确。

( 只需要让 CATALINA_HOME= 之后的路径跟 Tomcat 的解压后的路径保持一致即可 )

当看到以下信息时,即表示 CATALINA_HOME 配置成功,并且 Tomcat 也正常启动了。

root@malajava:~# catalina.sh run
Using CATALINA_BASE:   /opt/web/apache-tomcat
Using CATALINA_HOME:   /opt/web/apache-tomcat
Using CATALINA_TMPDIR: /opt/web/apache-tomcat/temp
Using JRE_HOME:        /opt/jdk/1.8.0_112
Using CLASSPATH:       /opt/web/apache-tomcat/bin/bootstrap.jar:/opt/web/apache-tomcat/bin/tomcat-juli.jar
........................此处省略一大坨日志信息(这个你们可以懂的)........................
19-Feb-2018 03:42:17.045 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-80"]
19-Feb-2018 03:42:17.147 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
19-Feb-2018 03:42:17.161 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 663 ms

此时,可以通过 浏览器 来访问 Tomcat 。

如果是本机进行操作,直接输入 http://localhost:8080 即可访问 Tomcat 首页。

如果是在远程主机上操作,可以输入 http://远程主机IP地址:8080 来访问 Tomcat 首页。

终止当前终端中的程序,可以使用 Ctrl + C 组合键来实现。

5、干掉意外

正常情况下,启动 Tomcat 是比较顺利的,并且耗时较少。

但是,从本人在 Linux 下搭建 Tomcat 运行环境的实际情况以及网络上大家的提问来看,

很多小伙伴会遭遇启动 Tomcat 时巨慢,甚至被卡住(此时使用浏览器是无法访问 Tomcat 的)。

[原因]

Tomcat 的 Session ID 是通过 SHA1PRNG 算法计算得到的,SHA1 算法需要一个密钥,这个密钥在 Tomcat 启动的时候随机生成一个,在 Linux 系统下生成该密钥时使用了 Linux 随机函数生成器/dev/random 。

而/dev/random会根据 噪音 产生随机数,如果噪音不够它就会阻塞。Linux 是通过 I/O,键盘终端、内存使用量、CPU 利用率等方式来收集噪音的,如果噪音不够生成随机数的时候就会被阻塞。

[解决方案]

解决上述问题有两个方案: 一个使用伪随机函数生成器,另外一个加大/dev/random的熵池。

这里采用第一种方案解决,关于 "/dev/random的熵池" 请自行研究。

第一种解决方案可以有两种实现方式:

  • 通过修改 Tomcat 启动文件 -Djava.security.egd=file:/dev/urandom
  • 通过修改 JRE 中的 java.security 文件 securerandom.source=file:/dev/urandom

本文中使用了修改 java.security 的方式(据博主的学生反映该方式是最简单粗暴的)。

[解决问题]

在终端中输入并回车,进入 JDK 主目录中:

root@malajava:~# cd $JAVA_HOME/jre/lib/security
root@malajava:/opt/jdk/1.8.0_112/jre/lib/security#

随后通过 ls 查看该目录中的文件清单:

root@malajava:/opt/jdk/1.8.0_112/jre/lib/security# ls -l
total 164
-rw-r--r-- 1 root root   4054 Sep 23  2016 blacklist
-rw-r--r-- 1 root root   1273 Sep 23  2016 blacklisted.certs
-rw-r--r-- 1 root root 112860 Sep 23  2016 cacerts
-rw-r--r-- 1 root root   2466 Sep 23  2016 java.policy
-rw-r--r-- 1 root root  27398 Feb 19 03:01 java.security
-rw-r--r-- 1 root root     98 Sep 23  2016 javaws.policy
-rw-r--r-- 1 root root   3527 Sep 23  2016 local_policy.jar
-rw-r--r-- 1 root root      0 Sep 23  2016 trusted.libraries
-rw-r--r-- 1 root root   3026 Sep 23  2016 US_export_policy.jar

通过 vi 修改该目录下的 java.security 文件:

root@malajava:/opt/jdk/1.8.0_112/jre/lib/security# vi java.security

默认情况下,大概在该文件的 115 行 前后,即可找到以下内容:

securerandom.source=file:/dev/random

将以上内容注释掉,并改为以下内容

securerandom.source=file:/dev/urandom

修改后的文件如下所示:

105 # The entropy gathering device can also be specified with the System
106 # property "java.security.egd". For example:
107 #
108 #   % java -Djava.security.egd=file:/dev/random MainClass
109 #
110 # Specifying this System property will override the
111 # "securerandom.source" Security property.
112 #
113 # In addition, if "file:/dev/random" or "file:/dev/urandom" is
114 # specified, the "NativePRNG" implementation will be more preferred than
115 # SHA1PRNG in the Sun provider.
116 #
117 # securerandom.source=file:/dev/random
118 securerandom.source=file:/dev/urandom

( 注意前面的数值是vi编辑器下的行号,不需要复制到你的文件中 )

经过以上修改后,重启 Ubuntu 即可解决前述问题。

( 2016年遇到过Ubuntu12.04环境下,因为APR导致的卡死 Tomcat 现象,在Ubuntu16.04中暂未遇到 )

( 如果有遇到的小伙伴,请私信我 )

6、实现开机自启

默认情况下,Tomcat 并不会随 Ubuntu 启动而开启。

本文中将通过设置 rc.local 脚本的方式来实现开机启动命令/脚本。

6.1、熟悉 rc.local 脚本的格式

rc.local 脚本是一个 Ubuntu 开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令。

该脚本位于/etc/目录下,需要 root 权限才能创建和修改,其基本格式如下:

#!/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.
  
exit 0

注意: 一定要将命令添加在 exit 0 之前。其中可以直接写命令或者执行shell脚本。

另外,通常将随开机启动的脚本放在 /etc/init.d 目录中。通过 cat 等命令可以查看到在 /etc/rc.local 中并没有具体的脚本代码(正如上面的基本格式中所包含的内容),而在 /etc/init.d/rc.local 中包含大量的脚本代码(这里不列出具体代码)。

因此,我们所创建的用来启动 Tomcat 的脚本也将放入到 /etc/init.d 目录中。

6.2、创建 tomcat 启动脚本

在终端中进入到 /etc/init.d/ 目录中,并使用 touch 命令创建名称为 tomcat 的脚本文件

root@malajava:~# cd /etc/init.d
root@malajava:/etc/init.d# touch tomcat
root@malajava:/etc/init.d# ls -l tomcat
-rw-r--r-- 1 root root 0 Feb 19 02:09 tomcat

为新创建的 tomcat 文件添加执行权限:

root@malajava:/etc/init.d# chmod a+x tomcat
root@malajava:/etc/init.d# ls -l tomcat
-rwxr-xr-x 1 root root 0 Feb 19 02:09 tomcat

使用 vi 命令在 tomcat 文件中添加以下内容:

#!/bin/sh  
#tomcat auto-start  
#  
# description: Auto-starts tomcat  
# processname: tomcat  
# pidfile: /var/run/tomcat.pid  

export JAVA_HOME=/opt/jdk/1.8.0_112
  
export CATALINA_HOME=/opt/web/apache-tomcat
  
case $1 in  
start)  
    sh $CATALINA_HOME/bin/startup.sh  
    ;;  
stop)  
    sh $CATALINA_HOME/bin/shutdown.sh  
    ;;  
restart)  
    sh $CATALINA_HOME/bin/shutdown.sh  
    sh $CATALINA_HOME/bin/startup.sh  
    ;;  
*)  
    echo 'Usage:tomcat start|stop|restart'  
    ;;  
esac  
  
exit 0

其中:

  • JAVA_HOME 是 JDK 的主目录,与之前下载JDK、解压、配置环境变量时一致
  • CATALINA_HOME 是 tomcat 的主目录,与之前下载Tomcat、解压、配置环境变量时一致

添加完成后,保存即可进入下一步操作。

6.3、通过 update-rc.d 增加开机启动服务

(1)、update-rc.d 命令

在 root 权限下使用 update-rc.d 命令可以增加、设置、移除开机自启服务,其常用形式如下:

1、update-rc.d [-n] [-f] name remove

2、update-rc.d [-n] name defaults

3、update-rc.d [-n] name disable|enable [ S|2|3|4|5 ]

有关于 update-rc.id 命令,请自行从网络上查询,这里不做详细介绍。

(2)、将新创建 6.2 中创建的 tomcat 脚本添加到开机启动

root@malajava:/etc/init.d# update-rc.d  tomcat  defaults

这步可能会有类似以下内容禁告:
insserv: warning: script 'K01tomcat' missing LSB tags and overrides
insserv: warning: script 'tomcat' missing LSB tags and overrides
忽略它即可,这并不影响后续操作。( 解决 insserv:warning 的方法请参看这篇博文 )

如果要将指定服务从开启自动服务中移除,可以使用 update-rc.d  tomcat  remove 来实现。

(3)、查看服务状态

使用 service 命令可以管理服务,其使用形式如下:

查看状态: service name status

启动服务: service name start

关闭服务: service name stop

重启服务: service name restart

其中 name 是指服务名称,比如查看刚刚添加的 tomcat 服务的状态,其形式如下:

root@malajava:~# service tomcat status
● tomcat.service - SYSV: Auto-starts tomcat
   Loaded: loaded (/etc/init.d/tomcat; bad; vendor preset: enabled)
   Active: failed (Result: timeout) since Mon 2018-02-19 05:01:12 CST; 1 day 7h ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/tomcat.service
           └─605 /opt/jdk/1.8.0_112/bin/java -Djava.util.logging.config.file=/opt/web/apache-tomcat/conf/logging.properties -Djava.util.loggi

Feb 19 04:56:11 malajava systemd[1]: Starting SYSV: Auto-starts tomcat...
Feb 19 04:56:11 malajava tomcat[582]: Tomcat started.
Feb 19 04:56:11 malajava systemd[1]: tomcat.service: PID file /var/run/tomcat.pid not readable (yet?) after start: No such file or directory
Feb 19 05:01:12 malajava systemd[1]: tomcat.service: Start operation timed out. Terminating.
Feb 19 05:01:12 malajava systemd[1]: Failed to start SYSV: Auto-starts tomcat.
Feb 19 05:01:12 malajava systemd[1]: tomcat.service: Unit entered failed state.
Feb 19 05:01:12 malajava systemd[1]: tomcat.service: Failed with result 'timeout'.
lines 1-14/14 (END)

( 注意,此时如果要回到 命令行状态,可以按 Ctrl + c 组合键 )

如果要查看全部服务列表,可以使用:

service --status-all

7、重启 Ubuntu ,测试 Tomcat 是否随开机自启动

在 root 权限下,输入 reboot 重新启动 Ubuntu :

root@malajava:~# reboot

重新启动 Ubuntu 后,应该可以查看到 tomcat 对应的进程:

root@malajava:~# ps -ef | grep tomcat
root       719     1  3 13:37 ?        00:00:02 /opt/jdk/1.8.0_112/bin/java -Djava.util.logging.config.file=/opt/web/apache-tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dignore.endorsed.dirs= -classpath /opt/web/apache-tomcat/bin/bootstrap.jar:/opt/web/apache-tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/web/apache-tomcat -Dcatalina.home=/opt/web/apache-tomcat -Djava.io.tmpdir=/opt/web/apache-tomcat/temp org.apache.catalina.startup.Bootstrap start
root      1064  1050  0 13:39 pts/0    00:00:00 grep --color=auto tomcat

列表中的第一个就是随系统自动启动而自动启动的 tomcat 进程。

这里的 ps 用于列出当前系统中正在运行的进程,grep 起过滤作用。

ps -ef | grep tomcat 的含义就是找到当前系统正在运行的所有进程并筛选其中包含 tomcat 的那些进程。

另外,当前执行的命令"ps -ef | grep tomcat"也包含"tomcat",所以也在列表中列出了(列表中的第二个)。

同时,我们也可以通过 service tomcat status 来查看 tomcat 服务的状态。

最后,我们可以通过浏览器来访问 tomcat 服务。

至此,在 Ubuntu 16.04 环境下实现 Tomcat 开机自启动设置完成。

有鉴于时间和精力有限,本文中难免错误和疏漏,不当之处,敬请指正。