【问题标题】:Disown shell once a process get started using shell script使用 shell 脚本启动进程后取消 shell
【发布时间】:2012-04-12 21:33:03
【问题描述】:

我正在尝试编写一个用于启动 tomcat 服务器的脚本,一旦脚本执行完成,该脚本就会与 shell 解除关联。例如,请看下面的屏幕截图。

bash-3.00# ./startup.sh
Using CATALINA_BASE:   /opt/tomcat/6.0.32
Using CATALINA_HOME:   /opt/tomcat/6.0.32
Using CATALINA_TMPDIR: /opt/tomcat/6.0.32/temp
Using JRE_HOME:        /opt/jdk1.6.0_26/
Using CLASSPATH:       /opt/tomcat/6.0.32/bin/bootstrap.jar
bash-3.00# ps -eaf | grep tomcat
    root  4737  2945   0 02:45:53 pts/24      0:00 grep tomcat
    root  4734 29777   1 02:45:42 pts/24      0:19 /opt/jdk1.6.0_26//bin/java -Djava.util.logging.config.file=/opt/tomcat/6.0.32/c

现在您可以看到,一旦脚本执行完成,tomcat 进程就会与 pts/24 相关联,直到我关闭 shell。 但我想要的是,即使外壳保持打开状态,进程也应该显示如下行为

bash-3.00# ps -eaf | grep tomcat
    root 13985  2945   0 22:40:13 pts/24      0:00 grep tomcat
    root 13977 29777   1 22:40:01 ?           0:22 /opt/jdk1.6.0_26//bin/java -Djava.util.logging.config.file=/opt/tomcat/6.0.32//

操作系统是 Solaris。我用来完成相同操作的各种选项是使用 nohup 和 disown,但该过程仍然与 shell 相关联。

另一种机制是放入 crontab 或使用 svc 使进程在系统启动时启动,即守护进程,或者我们可以编写一个小的 C 程序来分叉一个进程并离开。

这里请注意该进程是在后台运行的。

但我想使用 shell 或 perl 脚本来实现相同的目的。所以任何关于相同的想法都会对我有很大帮助。

提前致谢。

【问题讨论】:

  • 你试过 nohup 和 & 的组合吗?
  • 是的,我仍然得到与 shell 相关的进程。基本上我做了如下 bash-3.00# nohup ./startup.sh & 但它仍然与 shell 相关联。
  • 我们没有使用 Solaris,而是使用 Java Service Wrapper '包装'Tomcat,我们展示了您在 Linux 下寻找的行为。

标签: perl bash shell solaris


【解决方案1】:

好吧,你可以自己去完成所有艰苦的工作,但是为什么有一个模块可以做到这一点:Proc::Daemon(不确定它是否适用于 solaris)

文档还描述了所使用的过程,如果您决定继续编写自己的守护程序代码,无论如何这对您理解很有用。

【讨论】:

    【解决方案2】:
    ( nohup ./script.bash & )
    

    括号内的子shell 立即退出,ps -ef |grep script.bash 返回:

    501 59614     1   0   0:00.00 ttys005    0:00.00 /bin/bash ./script.bash
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-18
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多