linux运行jar包
要运行java的项目需要先将项目打包成war包或者jar包,打包成war包需要将war包部署到tomcat服务器上才能运行。而打包成jar包可以直接使用java命令执行。在linux系统中运行jar包主要有以下四种方式。
一、java -jar xxx.jar
这是最基本的jar包执行方式,但是当我们是当我们用ctrl+c中断或者关闭窗口时时,程序也会中断执行,当然关闭或重启虚拟机也同样如此。
二、java -jar xxx.jar &
&代表在后台运行,使用ctrl+c不会中断程序的运行,但是关闭窗口会中断程序的运行。
三、nohup java -jar xxx.jar &
使用这种方式运行的程序日志会输出到当前目录下的nohup.out文件,使用ctrl+c中断或者关闭窗口都不会中断程序的执行。
四、nohup java -jar xxx.jar >temp.log &
temp.out的意思是将日志输出重定向到temp.log文件,使用ctrl+c中断或者关闭窗口都不会中断程序的执行。
查看jar包进程
- ps aux|grep xxx.jar
- ps -ef | grep java
- ps aux|grep java
将会看到此jar的进程信息:
root 2373 0.9 15.8 2575356 296448 pts/0 Sl+ 16:28 1:18 java -jar erp-0.5.1.2.jar
或
root 2373 2004 0 16:28 pts/0 00:01:18 java -jar erp-0.5.1.2.jar
停止jar包
也就是杀死进程
找到jar的pid,杀掉命令为:
- kill -9 pid
- pkill 进程名
jar包不可以正常访问,本地正常访问,猜测问题所在应该是防火墙端口没有开放
top
有时候通过top命令可以看到有个别进程占用的内存比较大,但是top无法直接查看到进程名以及进程所在的目录。所以我们可以通过以下方法来定位。
ps -aux |grep -v grep|grep 28990
查看端口号:
查看端口号是否被占用:netstat -anp |grep 端口号
查看当前所有已经使用的端口情况:netstat -nultp
查看指定端口号的进程情况:netstat -tunlp | grep 端口号
几个参数含义
- -t (tcp) 仅显示tcp相关选项
- -u (udp)仅显示udp相关选项
- -n 拒绝显示别名,能显示数字的全部转化为数字
- -l 仅列出在Listen(监听)的服务状态
- -p 显示建立相关链接的程序名
1. lsof -i:端口号 用于查看某一端口的占用情况
需要注意的是,centos默认是没有安装lsof(list open files)的,需要手动安装
yum install lsof
各列代表的含义:
- COMMAND:进程的名称
- PID:进程标识符
- USER:进程所有者
- FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
- TYPE:文件类型,如DIR、REG等
- DEVICE:指定磁盘的名称
- SIZE:文件的大小
- NODE:索引节点(文件在磁盘上的标识)
- NAME:打开文件的确切名称
jar包启动遇到问题:
java.sql.SQLSyntaxErrorException: Table 'gongrenbao.QRTZ_LOCKS' doesn't exist]分析如下:
问题:
spring-boot 整合quartz的时候,连接windows的mysql的时候好好的,然而用linux上的mysql的时候,启动就报了这个错:
Failure obtaining db row lock: Table ‘test.QRTZ_LOCKS’ doesn’t exist
分析:
首先用windows的mysql是没问题的。
其实linux的mysql也是有这个表的,但由于是从windows复制过去的,所以表名都是小写的,而quartz启动的时候找的是大写,所以认为test.QRTZ_LOCKS这个表不存在。
原理就在于mysql有个配置属性:lower_case_table_names
windows上安装mysql,默认是1,代表忽略大小写
linux上安装mysql,默认是0,代表不忽略大小写
所以在windows好好的,在linux上就报错了。
解决:
方法1:最快的解决办法,就是将所有quartz开头的表,都换成大写就好了
方法2:让linux也像windows一样,忽略大小写。
具体就是设置linux上的lower_case_table_names=1,就和windows一样了。步骤如下:
1、先执行sql查看lower_case_table_names,如下图:
show variables like '%lower_case_table_names%';
2、修改/etc/my.cnf文件,在文件末尾加lower_case_table_names=1,如下图。
3、保存退出,重启mysql即可。用到的命令:
cd /etc
vim my.cnf
末尾加上lower_case_table_names=1 保存退出
systemctl restart mysqld
(相关启动和状态命令:
systemctl start mysqld
systemctl status mysqld
systemctl stop mysqld)
4、重启完再看lower_case_table_names的值
再次启动项目,就成功了
[main] DEBUG org.springframework.boot.context.logging.ClasspathLoggingApplicationListener - Application failed to start with classpath:
java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'
application.yml和application-dev.yml配置有问题
jar包开机自启动:
1、在任意文件夹下创建脚本文件
vim /root/gongrenbao/startup.sh
配置自己服务器的JDK环境(可通过vim /etc/profile或者more /etc/profile查看jdk配置)
export JAVA_HOME=/usr/local/jdk1.8.0_211
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
配置启动jar包命令
nohup java -jar xxx.jar >temp.log &(脚本文件完成)
2、赋予脚本文件权限
chomd 777 startup.sh(可在此进行sh startup.sh执行脚本)
3、编辑rc.local文件,加入jar启动脚本
vim /etc/rc.local或者是vim /etc/rc.d/rc.local
4、重启系统
5、ps -ef|grep java(查询进程)