我有一个需要花费大量时间才能完成的脚本。
我宁愿退出并稍后检索其输出,而不是等待它完成。
我试过了;
at -m -t 03030205 -f /path/to/./thescript.pl
nohup /path/to/./thescript.pl &
我还验证了ps
和at -l
实际存在的进程,具体取决于我使用的调度语法。
当我退出shell时,这两个进程都会死掉。有没有办法在关闭连接时阻止脚本终止?
我们这里有crons,它们已经设置好并且工作正常,但我想将at
或nohup
用于一次性脚本。
我的语法有问题吗?有没有其他方法可以产生预期的结果?
<小时/> 修改:screen
或disown
- 它们未安装在我的HP Unix设置中,我无法安装它们
答案 0 :(得分:11)
使用screen。它会创建一个终端,在您注销时继续运行。重新登录后,您可以切换回它。
答案 1 :(得分:5)
If you want to keep a process running after you log out:
disown -h <pid>
是一个有用的bash内置。与nohup
不同,您可以在已经运行的流程上运行disown
。
首先,使用control-Z停止工作,从ps
获取pid(或使用echo $!
),使用bg
将其发送到后台,然后使用{{1带-h标志。
不要忘记记录你的工作,否则当你退出时就会被杀死。
答案 2 :(得分:4)
这只是猜测,但我在ssh和nohup的某些版本中看到过:如果你已经使用ssh登录,那么你可能需要重定向stdout,stderr 和 stdin以避免在退出时挂起会话。 (其中一个可能仍然附在终端上。)我会尝试:
nohup /path/to/./thescript.pl > whatever.stdout 2> whatever.stderr < /dev/null &
(我的当前版本的ssh和nohup不再是这种情况 - 后者如果检测到任何附加到终端时重定向它们 - 但您可能使用不同的版本。)
答案 3 :(得分:1)
nohup的语法看起来没问题,但您的帐户可能不允许在注销后运行进程。另外,尝试将stdout / stderr重定向到日志文件或/ dev / null。
答案 4 :(得分:1)
在后台运行您的命令。
/path/to/./thescript.pl &
获取后台工作的点击次数
jobs
现在,您可以通过其jobid选择性地拒绝任何上述作业。
disown <jobid>
即使您已退出,所有不相关的流程也应继续运行。