跳到正文
网络寻租
返回

如何让进程后台执行

很多时候我们需要让一个进程在后台执行。

终端下面执行命令

比如我们要执行cmd,可以简单地在命令行运行cmd &。

如果我们希望重定向输出到其他的地方,可以用:

cmd 2>&1 > run.log &

里面 2>&1 是把stderr重导向到stdout,然后> run.log把stdout重导向到文件。

但是如果关闭当前终端,后台跑的进程还是会被退出掉,这个时候需要工具:

daemon cmd

如果你是用ruby写的程序,也可以有一个Gem来帮你完成这个工作。

原理

后台化主要做的事情就是让生成的后台进程不被你的命令行以及调用者影响到, 具体需要做的步骤如下:

示例代码如下:

module Daemon
  extend self

  def run
    5.times.each do
      sleep 1
      puts Time.now
    end
  end

  def start
    Process.fork do
      Process.setsid
      Process.fork do
        Dir.chdir(File.expand_path("."))
        File.umask(0)

        $stdin = File.open('/dev/null')
        $stdout = File.open('s.log', 'w+')
        $stderr = File.open('/dev/null')
        self.run

        exit
      end
      exit
    end
  end
end

Daemon.start

保存成daemon.rb,然后执行ruby daemon.rb。

我在上面的测试代码中,如果去掉setsid和第二遍fork,执行代码,关闭当前的终端,进程还是在后台正常执行。 所以我不是很清楚它们的具体影响,欢迎有知道的人帮忙指导一下。

更新疑问:

有朋友回复,setsid用来设置成新的session和process group,这样就不会被来自父进程的killpg等操作影响, 还有就是,第二遍fork是让进程不再是process group leader,这样不能重新获得一个终端。这个操作是可选的。

引用材料:


分享这篇文章:

上一篇
最简单的搜索引擎
下一篇
为什么我要每天写日记

评论

评论通过 GitHub 账号发布,需要先使用 GitHub 登录。