螢幕指令進程ID

螢幕指令進程ID

首先,我很抱歉我的英文不好,而且我是 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)

相關內容