作為java人爱榕,工作中經(jīng)常需要手動(dòng)重啟某個(gè)進(jìn)程,那就需要進(jìn)入某個(gè)目錄重啟進(jìn)程花履。如果是gitlab自動(dòng)發(fā)版的芽世,會(huì)產(chǎn)生多個(gè)目錄,此時(shí)就不清楚待重啟的程序在哪個(gè)目錄诡壁,需要用find命令找到最新的一個(gè)文件所在目錄济瓢,然后進(jìn)入重啟,這種方法甚是麻煩妹卿。
作為程序人旺矾,對(duì)于重復(fù)工作,絕對(duì)不允許手動(dòng)工作的夺克,腳本走起箕宙。
快捷進(jìn)入進(jìn)程目錄:cdp
核心點(diǎn)
- 利用
pwdx <pid>
命令顯示進(jìn)程所在目錄(與之等效的還有:readlink /proc/<pid>/cwd
) - 利用
exec
切換當(dāng)前工作目錄,屬于新開啟一個(gè)會(huì)話铺纽。
使用
封裝pwd
命令柬帕,讀取程序所在目錄后將工作路徑切換到程序所在目錄。
- 將此命令放到
/usr/bin/
下即可使用。# 作為公共腳本陷寝,方便其他用戶也能使用 -
chmod +x cdp
# 確保所有用戶都有可執(zhí)行權(quán)限 - 查看用法
[root@lziuasnliw home2]# cdp -h
Usage:
/bin/cdp [-h] [pid | JARfilename]
Options and Arguments:
-h,--help Print usage
--select select target process by classname or JARfilename
<pid | JARfilename> Target pid or JARfilename
EXAMPLES:
./cdp <pid> # java進(jìn)程pid
./cdp --select demo-test # java程序名稱锅很,jar文件名或部分文件名
./cdp demo-test # java程序名稱,jar文件名或部分文件名
- 在任意目錄下執(zhí)行:
cdp <pid>
# 回車后盼铁,即可切換至程序相應(yīng)目錄粗蔚。
特性
- 選擇列表
該腳本參考arthas的as.sh文件(會(huì)java的尝偎,應(yīng)該都知道arthas工具吧饶火?),帶了一個(gè)模糊功能致扯,即給定一個(gè)jar文件名的一部分肤寝,會(huì)顯示相關(guān)列表方便選擇(也就需要自己通過ps查進(jìn)程id了,很煩麻煩)抖僵。即
[root@lziuasnliw home2]# cdp meta
Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 906125 meta-pull-1.0.2.jar
[2]: 307301 meta-api-provider-1.0.2.jar
[3]: 67619 meta-api-consumer-1.0.2.jar
[4]: 307401 meta-material-1.0.0.jar
此時(shí)鲤看,輸入前面序號(hào)即可進(jìn)入相關(guān)目錄:
[root@lziuasnliw home2]# cdp meta
Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 906125 meta-pull-1.0.2.jar
[2]: 307301 meta-api-provider-1.0.2.jar
[3]: 67619 meta-api-consumer-1.0.2.jar
[4]: 307401 meta-material-1.0.0.jar
2 # 選擇進(jìn)程第二個(gè)進(jìn)程
307301 meta-api-provider-1.0.2.jar # 顯示第二個(gè)進(jìn)程pid和jar文件名
TARGET_PID=307301
dir=/home1/java/meta-data/java_#10743 # 打印第二個(gè)進(jìn)程jar文件所在目錄,并進(jìn)入該目錄
[root@lziuasnliw java_#10743]#
- 直接傳入pid
若已知進(jìn)程id耍群,則也可以直接把進(jìn)程id當(dāng)作參數(shù)傳入
[root@lziuasnliw home2]# cdp 307301
TARGET_PID=307301
dir=/home1/java/data-center/java_#10743 # 直接查到進(jìn)程jar文件所在目錄义桂,并進(jìn)入該目錄
[root@lziuasnliw java_#10743]#
- 保留了arthash參數(shù)
--select
保留了可以使用,但畢竟還需要敲--select
這幾個(gè)字母蹈垢,還沒有./cdp <pid | JARfilename>
方便慷吊。所以推薦還是第一個(gè)。
限制或問題
- 限制查java程序:正因?yàn)閰⒖剂薬rthas的as.sh文件曹抬,arthas使用的是
jps -l
查看pid和名稱的溉瓶,而不是ps命令,也就導(dǎo)致限制只能查java進(jìn)程(以后有時(shí)間會(huì)優(yōu)化)谤民。 - 無法查看歷史命令記錄:因?yàn)?code>exec實(shí)現(xiàn)切換工作目錄堰酿,屬于新開啟一個(gè)會(huì)話,切換前的命令及歷史記錄不會(huì)攜帶张足。要想查看之前會(huì)話記錄則只能
exit
推出當(dāng)前新的會(huì)話触创。 - 若執(zhí)行時(shí)直接提示:
: No such file or directory
,這是由于腳本文件本身包含了 Windows 樣式的換行符(CR LF)为牍,而不是 Unix/Linux 系統(tǒng)所期望的換行符(LF)哼绑。可以使用sed -i -e 's/\r$//' ./cdp
替換后執(zhí)行吵聪×枘牵或使用idea重新編輯(換行符改成LF)后保存也可以。(我實(shí)現(xiàn)在vscode編輯吟逝,雖然改成了LF但也不行帽蝶。可能是我沒有設(shè)置正確或設(shè)置沒有生效)