是否可以从终端运行程序并在关闭终端后继续运行?

时间:2012-01-27 16:37:42

标签: c linux

我编写了一个程序,我通过SSH连接到盒子后运行。它有一些用户交互,例如在提示后选择选项,通常我等待它执行的进程在注销之前完成关闭终端并结束程序。但是现在这个过程非常冗长,我不想在登录时等待,所以我怎么能在C中实现这个解决方法呢?

6 个答案:

答案 0 :(得分:7)

您可以按照“&”

的命令在后台运行程序
  

wget -m www.google.com&

或者,您可以使用“屏幕”程序,它允许您附加-deattach会话

  

屏幕wget -m www.google.com

     

(按CTRL + D)

     

screen -r(TO RE ATTACH)

http://linux.die.net/man/1/screen

答案 1 :(得分:3)

当shell退出时,该过程被发送HUP信号。您所要做的就是安装一个忽略SIGHUP的信号处理程序。

或者只是使用nohup运行程序。

答案 2 :(得分:2)

执行此操作的传统方法是使用nohup(1)命令:

nohup mycmd < /dev/null >& output.log &

当然,如果您不关心输出,也可以将其发送到/ dev / null,或者如果需要,您可以从文件中获取输入。

这样做会保护您的进程免受通常导致其退出的SIGHUP的影响。您还需要像上面一样重定向stdin / stdout / stderr,因为您将结束ssh会话。

上面显示的语法适用于bash。

答案 3 :(得分:1)

您可以使用 screen 命令。 here is a tutorial。请注意,您可能需要将其安装到您的系统中。

答案 4 :(得分:0)

有很多选项:-) TIMTOWTDI ...但是,出于您的目的,您可能会考虑运行命令行实用程序,例如dtach或GNU screen

如果你真的想在C中实现某些东西,你可以重新发明那个轮子,但是根据你对问题的描述,我怀疑它应该是必要的......

答案 5 :(得分:0)

背景一个过程的实际C代码是微不足道的:

//do interactive stuff...  
if(fork())
     exit(0);
//cool, I've been daemonized.

如果您知道代码永远不会出现在非Linux或BSD机器上,您甚至可以使用daemon()

//interactive...
daemon(0, 0);
//background...