当射击窗口关闭时,bash中的后台作业正在关闭:如何避免这种情况?


2

你可以快速回答这个问题,开始阅读“说了那么多”
以下是我的具体需求的详细信息

我正在使用lubuntu oneiric并试图创建一个桌面启动器来启动/停止tomcat。 我遇到了解释的问题 在这个帖子里 我昨天在lxde论坛上开了。

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

我希望关闭那个窗口,同时让tomcat继续运行。
窗口只需要执行命令来启动它而不需要其他任何东西。

在上面命令运行的whoooole代码里面搜索我终于发现guilty是以下代码:

/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窗口(我在上面执行long命令的那个窗口),那么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窗口后,这个作业仍然在运行?

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

对于那些在首页阅读我的详细信息的人:
奇怪的是,如果我打开一个lxterminal窗口,直接键入
/usr/local/tomcat6/bin/startup.sh
然后关闭那个窗口..然后tomcat仍在运行。 不是从桌面启动器,它只是打开一个lxterminal窗口并触发相同的命令然后关闭!


3
你可能想要 nohup 要么 screen,取决于流程是否是交互式的,您需要回到它。
David Schwartz

1
如果你跑 exit 或按 CTRL+D 该工作将不再关闭窗口,而是保持运行(如果通过后台运行 & )。
Patrick

Answers:


2

使用简单的解决方案 屏幕 您可能需要安装它

apt-get install screen

然后你可以使用

screen your_command_here

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

screen -r 

回到那个屏幕窗口。



1

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

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

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


当父母去世时,一个过程的孩子不会被杀死。只有当一个 互动 shell退出,它会向在该shell下运行的所有作业发送一个SIGHUP。
Patrick

@Patrick感谢您的提示!问题是我也使用了交互式shell ..请参阅我编辑的解决方案。
Luca Borrione

0

解决了:

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

A)放入.profile也是tomcat需要的东西

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并退出:
所以我的桌面启动器有

[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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.