你可以从“话虽如此”开始快速进入问题
以下是我的具体需求的详细信息
我在 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