我有一个已经运行了很长时间并且不想结束它的进程.
我怎么把它放在nohup下(也就是说,即使关闭终端,如何让它继续运行?)
我ssh -p8520 username@remote_host
用来登录远程服务器.
问题:
当我在工作场所时,它始终连接并正常工作.不幸的是,在我从家里连接远程服务器后10到15分钟终端冻结了.
控制台上没有错误/超时报告,但光标不能再移动.
当进入w检查登录用户时,一些僵尸登录用户在那里,我必须手动杀死他们.
这很烦人.谁能帮我?
可能重复:
在关闭SSH客户端后阻止后台进程停止
我有一个需要很多时间才能完成的程序.它在ssh上以root身份运行.
我希望它在我退出后继续运行,这是否可能,我将如何实现这一目标?
我正在使用Putty连接到远程服务器.我想知道的是,如果有任何方法可以编写我的命令并允许它们在我用Putty关闭会话后继续运行.原因是我不想一直打开电脑.有没有办法做到这一点?
更新解决方案
对于我提出的问题,最好的解决方案是使用提供的命令之一,如nohup,因为您不必安装任何其他软件.但如果您遇到同样的问题,请使用屏幕,安装并使用它.真是太棒了.
我选择了Norman Ramsey的答案作为最爱,因为提出了几个使用命令和屏幕的解决方案.但请特别检查PEZ的其他答案,然后您就可以了解屏幕能够做什么.
目前,我有两个服务器在一个EC2
实例(MongoDB
和bottlepy
)上运行.当我连接到实例并启动这两个服务器时,一切正常.但是,当我关闭SSH会话(实例仍在运行)时,我丢失了这两台服务器.退出后有没有办法让服务器保持运行?我Bitvise Tunnelier
在Windows 7上使用.我使用的实例是Ubuntu Server 12.04.3 LTS.
我有一个带有无限循环的PHP脚本.我需要这个脚本永远运行.所以,我跑了
php /path/to/script.php > /dev/null &
Run Code Online (Sandbox Code Playgroud)
它在我当前用户的安全上下文中在后台运行.但当我关闭终端窗口(注销)时,当然,CentOS Linux会杀死我的程序.
我看到两个猜测:在后台运行不同的用户或制作一个守护进程.我在每种情况下都需要帮助.
非常感谢!
我有一个C程序,我可以通过终端访问和交互(通常来自Linux机器上的SSH).我一直试图找到问题的解决方案,在我关闭终端/注销后,流程以它结束(程序基本上要求一些选项然后进行业务,不需要进一步的交互,所以我想拥有它在我注销SSH之后继续运行).
在Linux中有一些方法可以避免这种情况,例如"屏幕",但我想用C编程,而不依赖于屏幕等已安装的软件包 - 即使这意味着重新发明轮子.
到目前为止,我理解fork()
成为守护进程的标准琐碎方法,所以任何人都可以帮助我完成允许上述过程发生的代码吗?
在父母内部:
main()
{
//Do interactive stuff
signal(SIGCHLD, SIG_IGN); //stops the parent waiting for the child process to end
if(fork())
exit(0);
// and now the program continues in the child process
Run Code Online (Sandbox Code Playgroud)
我现在可以注销关闭原始shell的SSH了......孩子继续工作!
在孩子内:
//Continue with processing data/whatever the program does (no input/output to terminal required)
exit(0);
Run Code Online (Sandbox Code Playgroud) 我有三个文件:monitor.sh,它启动python脚本:
sudo python ./webCheck &
sudo python ./apiCheck &
Run Code Online (Sandbox Code Playgroud)
和其他人,webCheck和apiCheck:它应该在我关闭终端后在后台运行.它以无限循环检查我的其他网站的可用性.
我无法让它工作,我正在尝试nohup,但无法正确使用语法.webCheck必须与sudo一起运行.是否也在sh脚本中包含nohup?我想因为monitor.sh只是应该启动另外两个,所以一个人不需要nohup.
怎么做?
[NB.这与如何从Java程序启动完全独立的进程有关?但不同]
我希望能够从"管理器"Java进程中生成外部进程(shell脚本),该进程应该在JVM被杀死时继续运行 - 但是当我杀死父Java程序时,孩子也被杀死了(注意,如果JVM自然退出,行为会有所不同).我最简单的测试程序是:
public class Runit {
public static void main(String args[]) throws IOException, InterruptedException {
Runtime.getRuntime().exec(args[0]);
// doesn't work this way either
// ProcessBuilder pb = new ProcessBuilder(args[0]);
// pb.start();
while (true) {
System.out.println("Kill me");
Thread.sleep(2000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和外部脚本:
#!/bin/sh
while [ 1 ] ; do
ls
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
跑来跑去
java -classpath jar-with-dependencies.jar temp.exec.Runit runit.sh
如果管理器只是退出(即取出Java程序中的"while"循环),则生成的进程继续运行,但是当我Ctrl+ cJava程序时,外部程序也被杀死,这不是我想要的.
我在Ubuntu上使用OpenJDK 1.6.
Edit1:将exec更改为
Runtime.getRuntime().exec("/usr/bin/nohup " + args[0]);
Run Code Online (Sandbox Code Playgroud)
没有帮助.
Edit2:如何在Java中正常处理SIGKILL信号中所述添加关闭挂钩并不会阻止正在传播给子节点 …
我使用PuTTy连接到我们的Ubuntu生产服务器.
我想使用Solr重新索引特定的模型.我想从Rails控制台运行reindex命令,即Modelname.reindex(因为它似乎比rake任务运行得更快.)
但是,我们正在查看大量数据,这种索引预计需要几个小时.
我希望能够在rails控制台中启动此任务,即使退出PuTTy,它也应该继续运行.这该怎么做?
Linux:关闭SSH客户端建议nohup 后阻止后台进程停止,但我不知道是否/如何使用rails控制台.