【问题标题】:exiting shell script with background processes退出带有后台进程的 shell 脚本
【发布时间】:2011-11-14 14:08:53
【问题描述】:

我需要以某种方式退出我的 script.sh(带有返回码 - 最好),它在后台运行一些其他命令和其他脚本。

我尝试通过

运行命令
nohup myInScript.sh &

我也尝试在 script.sh 的末尾使用

disown -a[r]

我也试图杀死它

kill $$ 

但脚本只是在最后一个命令之后挂起并且不会退出。 运行命令后如何强制退出? 请帮忙。

编辑:更具体地说,我正在另一台机器上通过 ssh 远程运行脚本。

【问题讨论】:

  • 最后一条命令是什么?
  • 最后一个命令是:echo Done。脚本写入完成,但挂起。我需要按 Ctrl+C 来结束它。当然,在一种情况下,最后一个命令是 kill $$。

标签: bash shell background-process


【解决方案1】:

如果任何仍在运行的子进程打开了标准(终端)文件句柄,登录 shell 即使在它完成后也会保留在内存中。普通(子进程)shell 似乎不会受此影响。因此,看看将您的 nohup 行更改为以下内容是否有任何不同。

nohup myInScript.sh >some.log 2>&1 </dev/null &

在 Centos5 上,如果我运行 parent.sh,我不会遇到问题。但如果我运行ssh localhost parent.sh,我会这样做。在这种情况下,我上面展示的 I/O 重定向解决了这个问题。

【讨论】:

  • 如果我不想要 some.log 怎么办?似乎正是我的问题,因为(我忘了提)我正在远程运行脚本 vie ssh
  • 也可以使用/dev/null。基本上,您只需将其重定向到某个地方即可将其与终端分离。实际上你可能会发现 nohup 会自动将 stdout 和 stderr 重定向到 nohup.out,所以你可能需要的只是 stdin 重定向。
  • 还有一个问题。如果我想将所有消息重定向到屏幕怎么办?
  • 你不能一边吃蛋糕一边吃 :) 父进程有效地“拥有”到终端的连接,终端通过ssh 连接到你的屏幕。这正是系统之前没有让它正常退出的原因。想想看。当您的ssh 退出并返回您时,远程和本地机器之间不再有连接,因此子进程(在remote 机器上运行)无法向您的屏幕写入消息(其中现在显示local 机器)。
【解决方案2】:

上述解决方案大部分时间都有效:

nohup myInScript.sh &gt;some.log 2&gt;&amp;1 &lt;/dev/null &amp;

但我有一个案例没有,不知道为什么。无论如何,at 命令成功了,甚至看起来更优雅:

at now -f my_script.sh

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2013-09-07
    相关资源
    最近更新 更多