linux後台啟動程序並記錄程序ID

2021-07-30 05:29:02 字數 2450 閱讀 2931

作業系統:win7

虛擬機器:centos7

最近搭建了elasticsearch+kibana,其中由於elasticsearch官方自帶後台啟動,並且會產生pid檔案,所以我自己就寫了指令碼使其變成系統命令。可以參考:

將自己寫的es指令碼變成系統的新命令

但是,kibana官方卻沒有自帶後台啟動的引數。假設使用&的方式,雖然可以做到後台啟動,但是卻不能產生pid檔案。為什麼一定要產生pid檔案呢?

因為這是linux的一種規範,你會發現,凡是你安裝的比較正規的軟體,都會產生pid檔案,它是用來記錄程序的id。也因此,也可以通過判斷是否產生pid來確定程式是否啟動。不過,也正因為它只是一種規範,所以不是一定要遵守的,比如kibana它啟動時,就不會產生pid檔案。

啟動kibana官方命令是

bin/kibana
經過我多次測試後,自己手寫的指令碼:

#! /bin/bash

echo

"current pid: $$"

#這句刪除也可以

#cp /dev/null kibana.log

bin/kibana > kibana.log 2>&1 &

echo

"$!"

echo

"$!" > pid #將上乙個後台程序寫入到pid檔案中

分析:

bin/kibana  > kibana.log

2>&1 &

這句話的作用就是 啟動kibana,並且後台啟動,將標準輸出和標準錯誤資訊重定向kibana.log檔案中。

進一步分析就是:

bin/kibana  > kibana.log # 將標準輸出寫入kibana.log中

2>&1

# 將標準錯誤資訊重定向到標準輸出中

& # 後台啟動,但是假設關閉終端crt,啟動的程式也會停止

#可以使用nohup,即使關閉終端,程式也不會停止

nohup bin/kibana > kibana.log 2>&1 &

上面指令碼中$$$!是內建。

$$表示的是當前程序id

$!表示的是上乙個後台程序

所以echo "$!"這句一定要放到啟動kibana命令的後面。echo "$!" > pid就是將上乙個後台程序id也就是kibana的程序id重定向到pid中。

重定向時,會先去判斷檔案pid是否存在。假設不存在,會自動建立,並且每次都是重新寫入,而不是追加。

執行指令碼:

./kibana.sh
就會產生pid檔案。

並且啟動時,產生的日誌都會重定向到kibana.log中。(kibana.log也是自己建立的)

如果不想每次都進入kibana目錄來啟動kibana,可以把自己寫的指令碼放到usr/bin中,使其變成系統命令。

①把指令碼放到usr/bin的目錄中

②調整好指令碼

調整後的指令碼:

#!/bin/bash

# 先進入相關目錄

cd /usr/programe_files/kibana-5.2.2/

if [ $1 == "start" ];then

nohup bin/kibana > kibana.log 2>&1 &

echo

"$!" > pid

elif [ $1 == "stop" ];then

kill `cat pid`

else

echo

"please make sure the position variable is start or stop."

fi

再把指令碼名去掉.sh,就可以使用:

啟動命令:kibana start

停止命令:kibana stop

程序後台啟動方法

1.忽略hup命令 hup 1 終端斷線 可用 nohup guard 重定向輸出檔名 2.將程序id設定為不在hup命令管轄範圍。setsid 呼叫setsid函式的程序成為新的會話的領頭程序,並與其父程序的會話組和 程序組 脫離。由於會話對控制終端的獨占性,程序同時與控制終端脫離,其程序父程序為...

linux關於後台啟動程式

正經學徒,佛系記錄,不搞事情 最終語句 nohup test.sh 1 dev null 2 1 解釋 建立test.sh測試指令碼 vi test.sh 內容 bin bash while true do echo 不停的執行 sleep 5 done 設定檔案許可權可執行 結果是內容直接輸出在控...

linux下後台啟動weblogic

進入到 weblogic user projects domains base domain bin目錄下,檢視.sh的檔案 ls sh 可以查出startweblogic.sh和stopweblogic.sh,這個就是weblogic當前域的啟動關閉命令。直接執行就可以啟動關閉這個域。但是直接執行...