C 是否可以从终端运行程序,并在关闭终端后使其继续运行?
我已经编写了一个程序,在通过SSH连接到box之后运行。它有一些用户交互,比如在收到提示后选择选项,通常我会等待它执行的过程完成,然后再注销,从而关闭终端并结束程序。但是现在这个过程相当长,我不想在登录时等待,那么我如何才能在C中实现此解决方案呢?您可以在后台通过使用带“&”的命令运行程序 wget-m www.google.com& 或者,您可以使用“screen”程序,它允许您附加deattach会话 屏幕wget-m www.google.com (按CTRL+D组合键) 屏幕-r(重新连接)C 是否可以从终端运行程序,并在关闭终端后使其继续运行?,c,linux,C,Linux,我已经编写了一个程序,在通过SSH连接到box之后运行。它有一些用户交互,比如在收到提示后选择选项,通常我会等待它执行的过程完成,然后再注销,从而关闭终端并结束程序。但是现在这个过程相当长,我不想在登录时等待,那么我如何才能在C中实现此解决方案呢?您可以在后台通过使用带“&”的命令运行程序 wget-m www.google.com& 或者,您可以使用“screen”程序,它允许您附加deattach会话 屏幕wget-m www.google.com (按CTRL+D组合键) 屏幕-r(重新连
您可以使用screen命令。注意:您可能需要将其安装到您的系统中。当外壳退出时,将向进程发送HUP信号。您所要做的就是安装一个忽略SIGHUP的信号处理程序
或者使用nohup运行程序 执行此操作的传统方法是使用nohup(1)命令:
nohup mycmd&output.log&
当然,如果您不关心输出,也可以将其发送到/dev/null,或者如果需要,也可以从文件中获取输入
这样做将保护您的进程不受通常会导致其退出的死机的影响。您还需要像上面那样重定向stdin/stdout/stderr,因为您将结束ssh会话
上面显示的语法是针对bash的。有许多选项:-)TIMTOWTDI…但是,出于您的目的,您可以考虑运行命令行实用程序,例如dtach
或GNUscreen
如果你真的想用C实现一些东西,你可以重新发明这个轮子,但是从你对这个问题的描述来看,我怀疑它是否有必要…实际的C代码对后台进程来说是微不足道的:
//do interactive stuff...
if(fork())
exit(0);
//cool, I've been daemonized.
如果您知道代码永远不会出现在非linux或BSD机器上,您甚至可以使用daemon()
因此,如果我像./program&那样运行程序,我仍然可以像正常一样与程序进行交互,但是当我关闭终端时,即使在注销后,它仍然在后台运行?不,如果您使用“&”运行程序,它将进入后台,但仍然输出到终端-但是您将无法与它进行交互。关闭终端后,它将继续工作。对于你所描述的,我明确建议使用“屏幕”——它非常有用。你的意思是它不能接受用户输入,但你可以让它报告它在做什么,例如?确切地说——通过屏幕,你可以像正常一样与它交互。用GUI术语把它想象成一个模拟窗口。你可以通过重新连接回到它,它将继续在后台运行,即使你结束了会话(只要你解除了它)。当我关闭终端时,我的程序也关闭了。你如何使用nohup运行程序?这对shell中与程序的交互有任何负面影响吗?谢谢,语法应该是“nohup命令参数&”。这意味着程序输出被写入一个名为nohup.out的文件——除非你将其重定向到另一个文件——并且stdin没有连接到终端。哦,但是你的程序是交互式的。在这种情况下,你需要屏幕。为什么用C?为什么Perl中的解决方案不好??我希望把所有的代码都保存在用C编写的实际程序中。不幸的是,您将无法与该程序交互。这是真的——我最初错过了问题的这一部分。但是,如果交互以可预测的方式进行,那么用户输入可以放在一个文件中,文件可以在stdin上重定向。真的是这样吗?因此,我可以在程序结束时使用它,并在终端仍在后台执行过程时退出终端(没有进一步的输出/输入打印)?更好的解决方案可能是调用
守护进程
函数。您甚至可以测试它:main(){int k=getchar();printf(“%c\n”,k);if(fork())退出(0);pause();}
,然后关闭终端,并ps ax | grep a.out
。一切都会一目了然。@BasileStarynkevitchdaemon()
不是POSIX,但问题被标记为Linux,并且daemon
是由Linux提供的。老实说,我很想从C实现这个解决方案,而不是依赖盒子上现有的程序。
//do interactive stuff...
if(fork())
exit(0);
//cool, I've been daemonized.
//interactive...
daemon(0, 0);
//background...