首先抱歉我的英语不好,我是新的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文件
不是100%确定我理解你的问题,但让我们试试:
$! 将从父母的工作,而不是从孩子的过程中
$! 是一个后台进程,屏幕并不完全是一个后台进程
此外屏幕-S不会分离屏幕,你可能需要更多的屏幕选项,你可能想要的东西
screen -dmS
也可以从屏幕内部尝试$$和$ BASHPID
你可以find屏幕的pid使用
screen -list | grep someserver | cut -f1 -d'.' | sed 's/\W//g'
杀死屏幕的pid也应该杀掉屏幕上正在运行的任何东西
如果你确定分离的屏幕的PID是不够的,你尝试使用pgrep来获取java的东西
所以,你试图用一个在屏幕上运行的命令replace一个在后台启动一个长时间运行的java命令的脚本?
我认为你的屏幕尝试实际上有两个问题。 首先,该屏幕命令不会退出/背景,直到java命令完成(或交互式用户input一些东西)。 其次, $! 真的不会在这里完成你想要的。
为了使屏幕正确背景,请使用:
screen -d -m -S someserver java -jar /home/someserver/someserver.jar
-d -m组合将以独立(后台)状态启动屏幕,这通常是启动脚本所需的。 如果java进程退出,它将自动退出并清理。
所以,现在你已经在启动的时候有正确的屏幕显示,你仍然需要获得进程的PID,以便控制(至less是停止)它。 但是捕获这个pid实际上是相当棘手的。 我认为你可以通过parsingscreen -ls输出,parsing/proc/ data和/或parsingps输出的组合来实现,但这样做会很棘手。 到目前为止,最简单的事情就是使用screen本身来控制这个过程。 也就是说,在你的stop()例程中,不要去掉java进程的pid,而应该这样做:
stop () { echo -n "Stopping someserver.jar: " screen -X -S someserver quit }
这将告诉屏幕会话(您已经通过-S已经识别)来终止在其控制下的所有进程并退出。
如果你真的需要subprocess的进程ID,像这样的应该做的伎俩:
cd /var/run/screen/S-$(whoami) parentpid=$(ls *.someserver | cut -d. -f1) pid=$(ps --ppid $parentpid -ho pid)