Linux服务器:如何使用nohup确保工作正常?

时间:2017-03-14 19:20:31

标签: linux bash nohup rscript

我所知道的和我尝试的内容:我在R中有一个脚本(称为GAM.R),我希望在后台运行,输出.rdata,.pdf和。 jpg文件。从命令行运行它相对简单:

row_number() 
over (partition by id
      order by date
      RESET WHEN MIN(value)  -- previous value not equal to current 
                 OVER (partition by id
                       order by date
                       rows between 1 preceding and 1 preceding) <> value
     ) - 1

但是,此代码需要很长时间才能运行,所以我很乐意将它发送到后台并让它在我退出并关闭计算机后工作。我理解这很简单,我的代码看起来像这样:

$ Rscript GAM.R

我用它来查看它是否正常工作:

$ nohup Rscript GAM.R >/dev/null 2>&1 &

问题:我不知道如何检查代码是否正常工作(有没有办法可以看到它的进展?)而且我不知道输出的去向。我可以看到第一个代码的进度和输出,所以我不能太离谱。似乎第二个代码的输出不会出现在第一个代码输出的位置。

4 个答案:

答案 0 :(得分:0)

您的命令行正在将所有输出转移到/dev/null又称“比特桶”。

考虑将其转移到临时文件:

   $ nohup Rscript GAM.R >/tmp/GAM.R.output 2>&1 &

然后您可以tail /tmp/GAM.R.output查看结果,默认情况下会显示文件的最后10行。您可以使用tail -f显示文件的结尾,以及实时的新输出。

请注意,重新启动之间不保证/tmp/文件系统存在。您可以将文件放在其他位置(如~/GAM.R.output,如果您需要确定。

但请注意,如果关闭计算机,则会中止所有处理。为此,您的机器必须继续运行,不能进入休眠或关机状态。

答案 1 :(得分:0)

您正在做的是使用>将脚本输出重定向到/dev/null并执行2>&1,您将错误输出重定向到同一位置。最后nohup执行您的进程并将其从当前终端分离。

总结一下你正在做的是创建一个进程并将其输出和错误输出重定向到null下存储的名为/dev的文件。

要回答您的问题,我建议您将输出重定向到您可以作为普通用户而非超级用户访问的文件夹。然后为确保一切正常,您可以打印此文件。

例如,你可以这样做:

nohup Rscript GAM.R >/home/username/documents/output_file 2>&1 &

然后从终端查看文件:

cat /home/username/documents/output_file

最后,如果您关闭电脑,我认为您的程序将继续运行,我认为没有办法实现。

答案 2 :(得分:0)

如果您想在后台运行您的程序并访问程序的输出,您可以通过编写

轻松完成
exec 3< <(Rscript GAM.R)

然后当你想检查程序运行的输出时

cat <&3 # or you can use 'cat /dev/fd/3'

答案 3 :(得分:0)

出色!感谢大家的帮助,特别是@Greg Tarsa。最终我需要使用:

$ nohup Rscript GAM.R >/usr/emily/gams/2017_03_14 2>&1 & 

上面用于运行脚本并将屏幕输出保存到emily / gams(称为“2017_03_14”,这是一个由命令生成的文件,而不是我原先想到的文件夹)。这也将我的.rdata,.pdf和.jpg输出文件从脚本输出到usr / emily。

然后我可以使用以下方式查看进度和运行程序:

$ tail -f 2017_03_14 #Shows the last 10 lines of the program's progress
$ ps #shows your running projects
$ ps -fu emily #see running projects regardless of session, where username==emily

本着完整性的精神,我还要注意,要取消流程,您可以使用:

$ kill -HUP processid #https://kb.iu.edu/d/adqw