
首先,我很抱歉我的英文不好,而且我是 Linux 新手。
當我這樣做時,它可以將進程 ID 寫入 pid 文件
start () {
echo -n "Starting someserver.jar: "
java -jar /home/someserver/someserver.jar &
echo $! > /home/hcserver/hcserver.pid
}
並且知道我正在使用此命令,但它無法寫入 pid 文件
start () {
echo -n "Starting someserver.jar: "
screen -S someserver java -jar /home/someserver/someserver.jar
echo $! > /home/someserver/someserver.pid
}
我如何獲取進程 ID 或修復此問題?
編輯:
root@server:/home/someserver# ps -ef | grep java
root 4332 1 0 22:03 ? SCREEN -S someserver java -jar /home/someserver/someserver.jar
root 4333 4332 0 22:03 pts/0 java -jar /home/someserver/someserver.jar
root 4363 3222 0 22:04 pts/3 grep java
我想寫4333進程id到pid文件
答案1
不是 100% 確定我理解你的問題,但讓我們試試看:
$!可以在parentshell中工作,而不是在子進程內部工作
$!用於後台進程,screen 並不完全是後台進程
另外 screen -S 不會分離螢幕,您可能需要更多螢幕選項,您可能想要類似的東西
screen -dmS
也可以從螢幕內部嘗試 $$ 和 $BASHPID
你可以使用以下命令找到螢幕的 pid
screen -list | grep someserver | cut -f1 -d'.' | sed 's/\W//g'
殺死螢幕的 pid 也應該殺死螢幕內運行的任何內容
如果您確定分離畫面的 pid 不足以滿足您的需要,請嘗試使用 pgrep 來取得 java 內容的 pid
答案2
那麼,您是否正在嘗試將在背景啟動長時間運行的 java 命令的腳本替換為在螢幕中運行該命令的腳本?
我認為您的螢幕嘗試實際上存在兩個問題。首先,在 java 指令完成(或互動式使用者輸入一些內容)之前,該 screen 指令不會退出/背景。其次,$!
這裡並不會真正做你想做的事情。
為了使螢幕正確進入背景,請使用:
screen -d -m -S someserver java -jar /home/someserver/someserver.jar
該-d -m
組合將以分離(後台)狀態啟動螢幕,這通常是您想要的啟動腳本。如果java進程退出,它會自動退出並清理。
因此,現在您已經在啟動時正確設定了螢幕背景,您仍然需要獲取進程的 pid,以便可以控制(或至少停止)它。但捕獲該 pid 實際上相當棘手。我認為你可以透過解析screen -ls
輸出、解析/proc/
資料和/或解析ps
輸出的某種組合來做到這一點,但這會很棘手。到目前為止,最簡單的事情是使用screen
自身來控制這個過程。也就是說,在您的stop()
例程中,不要殺死 java 進程的 pid,而是執行以下操作:
stop () {
echo -n "Stopping someserver.jar: "
screen -X -S someserver quit
}
這將告訴螢幕會話(您-S
之前已經透過該會話識別)終止其控制下的所有進程並退出。
如果你確實需要子進程的進程ID,類似這樣的事情應該可以解決問題:
cd /var/run/screen/S-$(whoami)
parentpid=$(ls *.someserver | cut -d. -f1)
pid=$(ps --ppid $parentpid -ho pid)