一個人做網(wǎng)站必應(yīng)搜索引擎國際版
當使用jps -lv查看java虛擬機進程
app.jar啟動后,居然出現(xiàn)兩個啟動進程,而且他們的端口都一樣,同一端口,是不允許啟動兩個相同app的。
使用進程ps查看進程工具
#ps ?-aux
參數(shù)說明:
a: 顯示跟當前終端關(guān)聯(lián)的所有進程
u: 基于用戶的格式顯示(U: 顯示某用戶ID所有的進程)
x: 顯示所有進程,不以終端機來區(qū)分
發(fā)現(xiàn)921是/usr/bin/rhsmcertd根本不是java進程,或者根本沒有對應(yīng)的進程。
難道是jps -lv查詢的java進程錯誤?
卸載訂閱管理器 RHSMCERTD服務(wù) rhsmcertd服務(wù),
即Red Hat Subscription Manager CERTification Daemon systemctl stop rhsmcertd.service
# 停止訂閱服務(wù) systemctl disable rhsmcertd.service
# 取消訂閱服務(wù)開機啟動 yum remove subscription-manager
jps命令簡介
jps(Java Virtual Machine Process Status Tool)是JDK提供的一個可以列出正在運行的Java虛擬機的進程信息的命令行工具,它可以顯示Java虛擬機進程的執(zhí)行主類(Main Class,main()函數(shù)所在的類)名稱、本地虛擬機唯一ID(LVMID,Local Virtual Machine Identifier)等信息。另外,jps命令只能顯示它有訪問權(quán)限的Java進程的信息。
雖然jps命令的功能比較單一,但它使用的頻率卻很高。對于本地虛擬機來說,本地虛擬機唯一ID和操作系統(tǒng)的進程ID(PID,Process Identifier)是一致的,如果同時啟動多個Java虛擬機進程,無法根據(jù)進程名稱確定某個進程,我們就是使用jps命令顯示主類名稱的功能區(qū)分出來。
查看java進程
#ps ?-ef|grep java
查看端口
#netstat ?-anop | grep 80
jps命令參數(shù)
命令語法:
jps [-q] [-mlvV] [hostid]
jps [-help]
命令參數(shù)說明:
-q:不顯示主類名稱、JAR文件名和傳遞給主方法的參數(shù),只顯示本地虛擬機唯一ID。
-mlvV:我們可以指定這些參數(shù)的任意組合。
-m:顯示Java虛擬機啟動時傳遞給main()方法的參數(shù)。
-l:顯示主類的完整包名,如果進程執(zhí)行的是JAR文件,也會顯示JAR文件的完整路徑。
-v:顯示Java虛擬機啟動時傳遞的JVM參數(shù)。
-V:不顯示主類名稱、JAR文件名和傳遞給主方法的參數(shù),只顯示本地虛擬機唯一ID。
hostid:指定的遠程主機,可以是ip地址和域名, 也可以指定具體協(xié)議,端口。如果不指定,則顯示本機的Java虛擬機的進程信息。
-help:顯示jps命令的幫助信息。
在沒有指定任何參數(shù)的情況下,jps命令會顯示每個Java虛擬機進程的本地虛擬機唯一ID,后面跟著主類名稱或JAR文件名的簡短形式。
命令顯示格式:
LVMID [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
其中所有輸出都以空格分隔,所以當arg或jvmarg中包含空格的時候,有可以不好分辨,需要注意一下。
jps命令示例
顯示本機的Java虛擬機進程:
# jps
15729 jar
92153 Jps
90267 Jstat
顯示主類的完整包名或JAR文件名:
# jps -l
15729 one-more-1.0.0.RELEASE.jar
112054 sun.tools.jps.Jps
90267 sun.tools.jstat.Jstat
顯示主類的完整包名或JAR文件名,并且顯示JVM參數(shù):
# jps -lv
15729 one-more-1.0.0.RELEASE.jar -Xmx1g -Xms1g -Xmn512m -XX:SurvivorRatio=4 -XX:MetaspaceSize=256m -XX:+UseG1GC
9043 sun.tools.jps.Jps -Denv.class.path=.:/usr/local/java/jdk1.8.0_251/lib:/usr/local/java/jdk1.8.0_251/jre/lib -Dapplication.home=/usr/local/java/jdk1.8.0_251 -Xms8m
90267 sun.tools.jstat.Jstat -Denv.class.path=.:/usr/local/java/jdk1.8.0_251/lib:/usr/local/java/jdk1.8.0_251/jre/lib -Dapplication.home=/usr/local/java/jdk1.8.0_251 -Xms8m
顯示主類的完整包名或JAR文件名,并且顯示傳遞給main()方法的參數(shù):
# jps -lm
15729 one-more-1.0.0.RELEASE.jar
59014 sun.tools.jps.Jps -lm
90267 sun.tools.jstat.Jstat -gc 15729 1000
結(jié)尾
雖然jps命令已經(jīng)推出很久并且使用頻率很高,但它仍然是一個“實驗性質(zhì)的,并且沒有技術(shù)支持的”(Experimental and Unsupported)工具,日后可能會被轉(zhuǎn)正,也有可能在某個JDK版本中無聲無息地消失。所以,且用且珍惜吧。
錯誤答案:
#jps -lv命令會列出所有正在運行的Java進程,包括那些由非標準用戶或非標準賬戶啟動的Java進程。
這些進程可能不會在標準的ps命令中列出,因為ps命令只顯示由標準用戶啟動的進程。
#ps ?-ef|grep??java??如果你只想查看由標準用戶啟動的Java進程
#ps ?-aux ?????????查看所有用戶的進程
標準用戶,非標準用戶
#cat ?/etc/passwd
/etc/passwd是一個文本文件,包含了系統(tǒng)中所有用戶的基本信息。這個文件的每一行都表示一個用戶的信息,包括用戶ID、用戶名、用戶主目錄、用戶登錄shell等。 以下是一個/etc/passwd文件的示例行:
username:x:1000:1000:username:/home/username:/bin/bash
在這個示例行中,username是用戶名,1000是用戶ID,1000是用戶組ID,username是用戶主目錄,/bin/bash是用戶的登錄shell。 /etc/passwd文件的每一行都由7個字段組成,字段之間用冒號分隔。這7個字段的含義如下:
- 用戶名:表示用戶賬戶的名稱。
- 用戶ID:表示用戶賬戶的唯一標識符。
- 用戶組ID:表示用戶所屬的用戶組的唯一標識符。
- 用戶信息:表示用戶的一些額外信息,例如用戶全名、用戶電話號碼等。
- 用戶主目錄:表示用戶賬戶的主目錄。
- 用戶登錄shell:表示用戶登錄系統(tǒng)后的默認shell。
你可以使用cat /etc/passwd命令來查看/etc/passwd文件的內(nèi)容。這個命令會將/etc/passwd文件的內(nèi)容顯示在終端中。
單獨查看用戶所屬的標準
在CentOS系統(tǒng)中,你可以使用id命令來判斷一個賬戶是否為標準賬戶。
標準賬戶的用戶ID通常是1000或更低的數(shù)字,而非標準賬戶的用戶ID通常是1000以上的數(shù)字。
#id ?hc
#id ?root
service服務(wù)為什么會啟動兩個java進程
之前我把Centos8的服務(wù)腳本存在/lib/systemd/system/里面,這個是錯誤的原因
#vi ??/lib/systemd/system/yourscript.service
[Unit]
Description=Your Script
After=network.target
[Service]
Type=simple
ExecStart=nohup /home/yourscript.sh &
[Install]
WantedBy=multi-user.target
參數(shù)說明:
WantedBy是一個在systemd服務(wù)配置文件中常用的選項,用于指定服務(wù)何時啟動或停止。
multi-user.target是一個目標,用于在系統(tǒng)啟動后創(chuàng)建多用戶模式。
graphical.target是一個目標,用于在系統(tǒng)啟動后創(chuàng)建圖形界面模式。
default.target 是一個目標上,然后按照systemd的啟動順序,先啟動multi-user.target,再啟動graphical.target,最后啟動service_name服務(wù)。
WantedBy選項可以被設(shè)置為多個目標,用逗號分隔。例如,WantedBy=multi-user.target graphical.target,表示這個服務(wù)需要在multi-user.target和graphical.target這兩個目標上運行。
正確答案:
yourscript.service應(yīng)該放在/etc/systemd/system文件夾下,而不是/lib/systemd/system文件夾下。
服務(wù)運行的用戶User及所屬組Group都是root。
Type=daemon 必須是通常用于運行后臺服務(wù)或者守護進程
這樣配置問題解決。
#vi ??/etc/systemd/system/yourscript.service
[Unit]
Description=Your Script
After=network.target
[Service]
Type=daemon
User=root
Group=root
ExecStart=nohup /home/yourscript.sh &
[Install]
WantedBy=multi-user.target
systemd的使用大幅提高了系統(tǒng)服務(wù)的運行效率, Systemd 可以管理所有系統(tǒng)資源,不同的資源統(tǒng)稱為 Unit(單位),而unit的文件位置一般主要有三個目錄:
/etc/systemd/system????系統(tǒng)管理員安裝的單元, 優(yōu)先級更高
/run/systemd/system????軟件運行時生成的配置文件
/lib/systemd/system?(/usr/lib/systemd/system)??系統(tǒng)或第三方軟件安裝時添加的配置文件。軟件包安裝的單元
這三個目錄的配置文件優(yōu)先級依次從高到低,如果同一選項三個地方都配置了,優(yōu)先級高的會覆蓋優(yōu)先級低的。
參數(shù)說明
systemctl start yourscript.service (啟動yourscript服務(wù))
systemctl stop yourscript.service ??或者 ?systemctl stop nginx (停止yourscript服務(wù))
systemctl enable yourscript.service (設(shè)置開機自啟動)
systemctl disable yourscript.service (停止開機自啟動,刪除服務(wù))
systemctl status yourscript.service (查看服務(wù)當前狀態(tài))
systemctl restart yourscript.service (重新啟動服務(wù))
通過/etc/rc.local自啟動app.jar
相對service方法,下面的方法配置比較簡單,效果一樣。
#vi ?/etc/rc.local
內(nèi)容如下:
/home/run_app.sh
#vi ?/home/run_app.sh
內(nèi)容如下:
#!/bin/bash
nohup /home/jdk-17/bin/java -server -Xmx512M -Xms512M -jar /home/app.jar --server.port=80 > /dev/null 2>&1 &
/etc/rc.local是Linux系統(tǒng)啟動時運行的自定義腳本文件。它通常位于 /etc/rc.d 目錄下,可以通過編輯該文件來添加需要自啟動的腳本程序。 在系統(tǒng)啟動過程中,rc.local文件會執(zhí)行自定義的命令和腳本,這些命令會在系統(tǒng)啟動后自動執(zhí)行,并且運行它們的用戶必須具有 root 權(quán)限。rc.local文件通常用于在系統(tǒng)啟動時執(zhí)行一些自定義的指令或者腳本,例如啟動服務(wù)、設(shè)置環(huán)境變量、配置網(wǎng)絡(luò)等。 在某些Linux發(fā)行版中,rc.local文件可能會被其他啟動加載文件(例如 /etc/init.d/rc.local)所替代。在Ubuntu系統(tǒng)中,有兩個rc.local文件,分別是/etc/rc.local和/etc/init.d/rc.local。在某些情況下,你可能需要在rc.local文件中手動添加一些命令或腳本,以便在系統(tǒng)啟動時執(zhí)行它們。