运行中的Java程序
[root@localhost /]# ps -ef | grep java
root 6207 16807 0 11:30 pts/0 00:00:00 grep --color=auto java
root 11861 1 0 7月17 ? 00:02:11 java -jar jeeplus-vue.jar
[root@localhost /]# ps -aux | grep java
root 6658 0.0 0.0 116956 1020 pts/0 S+ 11:30 0:00 grep --color=auto java
root 11861 0.1 13.6 5718012 1086144 ? Sl 7月17 2:11 java -jar jeeplus-vue.jar
# PID(进程号)为11861
1、ps -ef用于查看全格式的全部进程,ps -aux也是用于查看进程。其中“ps”是在Linux中是查看进程的命令,“-e ”参数代表显示所有进程,“-f”参数代表全格式。
2、ps -ef和ps aux,这两者的输出结果差别不大,但展示风格不同。aux是BSD风格,显示的项目有:USER , PID , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND。而-ef是System V风格,显示的项目有:UID , PID , PPID , C , STIME , TTY , TIME , CMD。
3、COMMADN列如果过长,aux会截断显示,而ef不会。
综上,如果想查看进程的CPU占用率和内存占用率,可以使用aux ,如果想查看进程的父进程ID和完整的COMMAND命令,可以使用ef。
找到Java程序的地址
[root@localhost /]# which java
/usr/local/java/jdk1.8.0_333/bin/java
[root@localhost /]# ll /proc/11861 #11861为进程号
总用量 0
dr-xr-xr-x 2 root root 0 7月 17 17:04 attr
-rw-r--r-- 1 root root 0 7月 17 17:04 autogroup
-r-------- 1 root root 0 7月 17 17:04 auxv
-r--r--r-- 1 root root 0 7月 17 16:43 cgroup
--w------- 1 root root 0 7月 17 17:04 clear_refs
-r--r--r-- 1 root root 0 7月 17 16:43 cmdline
-rw-r--r-- 1 root root 0 7月 17 17:04 comm
-rw-r--r-- 1 root root 0 7月 17 17:04 coredump_filter
-r--r--r-- 1 root root 0 7月 17 17:04 cpuset
lrwxrwxrwx 1 root root 0 7月 17 17:04 cwd -> /var/apps/maintenanceSystem
-r-------- 1 root root 0 7月 17 16:43 environ
lrwxrwxrwx 1 root root 0 7月 17 16:43 exe -> /usr/local/java/jdk1.8.0_333/bin/java
dr-x------ 2 root root 0 7月 17 16:43 fd
dr-x------ 2 root root 0 7月 17 17:04 fdinfo
-rw-r--r-- 1 root root 0 7月 17 17:04 gid_map
-r-------- 1 root root 0 7月 17 17:04 io
-r--r--r-- 1 root root 0 7月 17 17:04 limits
-rw-r--r-- 1 root root 0 7月 17 17:04 loginuid
dr-x------ 2 root root 0 7月 17 17:04 map_files
-r--r--r-- 1 root root 0 7月 17 16:43 maps
-rw------- 1 root root 0 7月 17 17:04 mem
-r--r--r-- 1 root root 0 7月 17 16:43 mountinfo
-r--r--r-- 1 root root 0 7月 17 17:04 mounts
-r-------- 1 root root 0 7月 17 17:04 mountstats
dr-xr-xr-x 6 root root 0 7月 17 16:43 net
dr-x--x--x 2 root root 0 7月 17 17:04 ns
-r--r--r-- 1 root root 0 7月 17 17:04 numa_maps
-rw-r--r-- 1 root root 0 7月 17 17:04 oom_adj
-r--r--r-- 1 root root 0 7月 17 17:04 oom_score
-rw-r--r-- 1 root root 0 7月 17 17:04 oom_score_adj
-r--r--r-- 1 root root 0 7月 17 17:04 pagemap
-r-------- 1 root root 0 7月 17 17:04 patch_state
-r--r--r-- 1 root root 0 7月 17 17:04 personality
-rw-r--r-- 1 root root 0 7月 17 17:04 projid_map
lrwxrwxrwx 1 root root 0 7月 17 17:04 root -> /
-rw-r--r-- 1 root root 0 7月 17 17:04 sched
-r--r--r-- 1 root root 0 7月 17 17:04 schedstat
-r--r--r-- 1 root root 0 7月 17 17:04 sessionid
-rw-r--r-- 1 root root 0 7月 17 17:04 setgroups
-r--r--r-- 1 root root 0 7月 17 17:04 smaps
-r--r--r-- 1 root root 0 7月 17 17:04 stack
-r--r--r-- 1 root root 0 7月 17 16:43 stat
-r--r--r-- 1 root root 0 7月 17 16:43 statm
-r--r--r-- 1 root root 0 7月 17 16:43 status
-r--r--r-- 1 root root 0 7月 17 17:04 syscall
dr-xr-xr-x 55 root root 0 7月 17 17:04 task
-r--r--r-- 1 root root 0 7月 17 17:04 timers
-rw-r--r-- 1 root root 0 7月 17 17:04 uid_map
-r--r--r-- 1 root root 0 7月 17 17:04 wchan
jar包位置
[root@localhost /]# find -name "jeeplus-vue.jar"
./var/apps/maintenanceSystem/jeeplus-vue.jar
运行Java脚本
[root@localhost /]# cd /var/apps/maintenanceSystem
[root@localhost maintenanceSystem]# ls
api.log application-production.yml jeeplus-vue.jar log startup.sh template tpid wz.png
[root@localhost maintenanceSystem]# ./startup.sh
-bash: ./startup.sh: 权限不够
[root@localhost maintenanceSystem]# sh startup.sh
11861
maintenanceSystem java serv is kill!
maintenanceSystem java serv is started.
[root@localhost maintenanceSystem]# . startup.sh
26669
maintenanceSystem java serv is kill!
maintenanceSystem java serv is started.
[root@localhost maintenanceSystem]# source startup.sh
26960
maintenanceSystem java serv is kill!
maintenanceSystem java serv is started.
1、第一种方式,是在当前的shell执行脚本本身,也就是说把test.sh当成一个文件执行,这时候我们需要拥有test.sh的运行权限(x权限),而且当我们在执行此命令时,有2个新进程在运行,一个是test.sh,一个是sleep,如果我们在执行第一个sleep时按ctrl+c终止脚本,test.sh和sleep一起终止,并且第二个sleep不会执行,因为整个test.sh运行已经终止。
2‘第二种方式,是新建一个shell执行test.sh脚本里面的命令,不需要执行权限,有读取权限(r权限)即可,在执行此命令时,有2个新进程在运行,一个是bash,一个是sleep,如果执行第一个sleep时按ctrl+c,bash被终止,结果和第一种方式一样,第二个sleep不会执行。
3、第三种方式,是在当前shell执行test.sh里面的命令,不需要执行权限,有读取权限(r权限)即可,在执行此命令时,只有一个新进程在运行,就是sleep,如果在执行第一个sleep时按ctrl+c终止,那么第二个sleep接着运行,直到脚本所有命令执行完。
4、第四种方式和第三种方式一致。
Shell脚本解析
[root@localhost maintenanceSystem]# cat startup.sh
#!/bin/bash # #!表示可执行的程序
cd /var/apps/maintenanceSystem # .sh脚本地址
tpid=`cat tpid|awk '{print $1}'`
# tpid是一个文件,里面主要负责记录所启动的jar的进程id,也就是pid。这里是将文件tpid的第一个字段给提了出来赋给tpid这个变量。awk命令其实是将每一行的第某个字段提取出来,这里tpid文件只有一行且只有一个字段,所以该处命令就是将tpid里的内容取出来。
tpid=`ps -aef|grep $tpid|awk '{print $2}'|grep $tpid`
# ps -aef 将所有进程查出来,得出结果1;
# grep $tpid 在结果1的基础上将涉及变量tpid的内容查出来,得出结果2;
# awk ‘{print $2}’ 在结果2的基础上将每行的第二个字段提取出来,得出结果3;
# grep $tpid 在结果3的基础上查找到与变量tpid一样的值更新tpid的值。
if [ ${tpid} ];
then
echo $tpid
kill -9 $tpid
echo 'maintenanceSystem java serv is kill!' # 输出文字
# 判断是否不为空。若是tpid的值不为空,那么就证明该进程在运行当中,则杀死进程
else
rm -f tpid
touch tpid
# 若是tpid的值为空,先强制删除文件,再次创建文件
fi
nohup java -jar jeeplus-vue.jar >api.log 2>log &
echo 'maintenanceSystem java serv is started.' # 输出文字
echo $! > tpid