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

linux java -jar命令 linux java运行jar包命令_linux

各列代表的含义:

  • 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%';

linux java -jar命令 linux java运行jar包命令_linux java -jar命令_02

 

2、修改/etc/my.cnf文件,在文件末尾加lower_case_table_names=1,如下图。

linux java -jar命令 linux java运行jar包命令_java_03

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的值

linux java -jar命令 linux java运行jar包命令_linux java -jar命令_04

 

再次启动项目,就成功了

[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(查询进程)