当触发窗口关闭时,bash 中的后台作业将关闭:如何避免这种情况?

当触发窗口关闭时,bash 中的后台作业将关闭:如何避免这种情况?

你可以从“话虽如此”开始快速进入问题
以下是我的具体需求的详细信息

我在 lubuntu oneiric 上尝试创建一个桌面启动器来启动/停止 tomcat。我遇到了一些问题,具体解释如下在此主题中我昨天在 lxde 论坛上打开了。

基本上,桌面启动器只在 lxterminal 窗口内执行命令
/usr/local/tomcat6/bin/startup.sh
,但如果我关闭启动器打开的执行命令的 lxterminal 窗口,那么 tomcat 就会关闭。

当然,我希望关闭该窗口,同时让 tomcat 继续运行。
窗口只需要执行启动命令即可,无需执行其他操作。

在通过上述命令运行的whoooole代码中进行搜索,我最终发现有问题的是以下代码:

/opt/jdk1.6.0_22/bin/java  \
-Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ \
-Dsolr.data.dir=/home/foo/solr/data \
-Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ \
-Dsolr.data.dir=/home/foo/solr/data \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
-Djava.util.logging.config.file=/usr/local/tomcat6/conf/logging.properties \
-Djava.endorsed.dirs="/endorsed" \
-classpath ":/usr/local/tomcat6/bin/bootstrap.jar:/usr/local/tomcat6/bin/commons-logging-api.jar" \
-Dcatalina.base="/usr/local/tomcat6" \
-Dcatalina.home="/usr/local/tomcat6" \
-Djava.io.tmpdir="/usr/local/tomcat6/temp" \
org.apache.catalina.startup.Bootstrap "" start \
>> "/usr/local/tomcat6"/logs/catalina.out 2>&1 &

事实上,如果我在一个新的 lxterminal 窗口中运行此命令,会注意到相同的行为:
A)tomcat 启动:如果我打开一个新的 lxterminal 并输入:

$ ps aux | grep tomcat
foo     21492  0.4  1.5 934436 47248 pts/2    Sl   11:37   0:03 /opt/jdk1.6.0_22/bin/java -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat6/conf/logging.properties -Djava.endorsed.dirs=/endorsed -classpath :/usr/local/tomcat6/bin/bootstrap.jar:/usr/local/tomcat6/bin/commons-logging-api.jar -Dcatalina.base=/usr/local/tomcat6 -Dcatalina.home=/usr/local/tomcat6 -Djava.io.tmpdir=/usr/local/tomcat6/temp org.apache.catalina.startup.Bootstrap  start
foo     21666  0.0  0.0   4476   768 pts/4    S+   11:53   0:00 grep --color=auto tomcat

B) 如果我关闭第一个 lxterminal 窗口(我在其中运行了上面的长命令),那么 tomcat 也会关闭。如果我在第二个 lxterminal 窗口中再次输入

$ ps aux | grep tomcat
foo     21694  0.0  0.0   4476   772 pts/4    S+   11:57   0:00 grep --color=auto tomcat



话说回来
上面的 looong 命令只是一个后台任务:如果我打开 lxterminal 并简单地输入

$ top &
[1] 21921

在保持此窗口打开的同时,我打开第二个 lxterminal 窗口并输入

$ ps aux | grep top
foo     21921  0.0  0.0   2452   764 pts/2    T    12:07   0:00 top
foo     21927  0.0  0.0   4476   772 pts/4    S+   12:08   0:00 grep --color=auto top

我可以看到“top”正在运行,而如果我关闭第一个窗口,然后从第二个窗口再次输入

$ ps aux | grep top
foo     21927  0.0  0.0   4476   772 pts/4    S+   12:08   0:00 grep --color=auto top

“top”命令也被关闭了。

那么有没有办法从 lxterminal 窗口启动一个作业,并且即使在关闭启动该作业的 lxterminal 窗口后,该作业仍可运行?

要明确的是:
我想打开一个执行命令(如top&)的lxterminal窗口,关闭这个lxterminal窗口并且仍然运行执行的命令。

对于那些阅读首页上我的详细资料的人来说:
奇怪的是,如果我打开一个 lxterminal 窗口,直接输入
/usr/local/tomcat6/bin/startup.sh
然后关闭该窗口,tomcat 仍然会运行。而从桌面启动器则不行,因为桌面启动器只会打开一个 lxterminal 窗口并触发相同的命令,然后它就会关闭!

答案1

一个简单的解决方案是使用屏幕 您可能需要通过以下方式安装

apt-get install screen

然后你可以使用

screen your_command_here

您可以使用 Ctrl-AD 退出 screen 但让它在后台运行。然后您可以使用

screen -r 

返回该屏幕窗口。

答案2

在 bash 中,你可以说:

my_program &
disown -h %1

http://www.gnu.org/software/bash/manual/bashref.html#Job-Control-Builtins

答案3

我认为你的(Tomcat)进程在终端窗口关闭时会被终止,因为在终端窗口中运行的 shell 是父母Tomcat 进程的进程。因此,当父进程被终止时,所有子进程也会被终止。

如果您不希望发生这种情况,您可以尝试像这样启动您的流程:

nohup /usr/local/tomcat6/bin/startup.sh

答案4

解决了:

感谢您的回答,我终于解决了这个问题:问题还在于我使用了交互式 shell 看到这个我的其他问题
因此解决方案是:

A)将 tomcat 需要的内容也添加到 .profile 中

export PATH=/opt/jdk1.6.0_22/bin:$PATH
export JAVA_HOME=/opt/jdk1.6.0_22
export JRE_HOME=/opt/jdk1.6.0_22
export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data"

B)删除所有交互式 shell 并添加 nohup 和 exit:
所以我的桌面启动器有

[Desktop Entry]
...
Exec=lxterminal --command "bash '/home/foo/scripts/Tomcat/tomcat-startup.sh'"
...

而 tomcat-startup.sh 基本上执行以下操作:

...
nohup bash "/usr/local/tomcat6/bin/startup.sh"
...
exit

一切都运行正常!:D

相关内容