Linux 服务器:如何使用 nohup 确保工作正常进行?
Linux server: How do I use nohup make sure job is working?
我所知道的和我尝试过的: 我在 R 中有一个脚本(称为 GAM.R),我想 运行输出 .rdata、.pdf 和 .jpg 文件的背景。 运行 这从命令行相对简单:
$ Rscript GAM.R
但是,这段代码需要很长时间才能 运行 所以我很乐意将它发送到后台,即使在我注销并关闭计算机后也让它继续工作。我知道这也很简单,我的代码如下所示:
$ nohup Rscript GAM.R >/dev/null 2>&1 &
我用它来查看它是否有效:
$ fg
nohup Rscript GAM.R > /dev/null 2>&1
问题:我不知道如何检查代码是否正常工作(有没有办法让我看到它的进度?)而且我不知道在哪里输出正在进行中。我可以看到第一个代码的进度和输出,所以我不能离得太远。似乎第二个代码的输出没有到达第一个代码输出的位置。
您的命令行正在将所有输出转移到 /dev/null
也就是位桶。
考虑将其转移到临时文件中:
$ nohup Rscript GAM.R >/tmp/GAM.R.output 2>&1 &
然后可以tail /tmp/GAM.R.output
查看结果,默认会显示文件的最后10行。您可以使用 tail -f
显示文件结尾,并实时添加新输出。
请注意,/tmp/
文件系统不能保证在重新启动之间存在。您可以将文件放在其他地方(如果需要确定,例如 ~/GAM.R.output
。
但是请注意,如果您关闭计算机,所有处理都会中止。为此,您的机器必须继续 运行 而不是休眠或关机。
您所做的是,使用 >
将脚本的输出重定向到 /dev/null
,而通过执行 2>&1
,您将错误输出重定向到同一个地方.最后 nohup
执行您的进程并将其与当前终端分离。
总而言之,您正在做的是创建一个进程并将其输出和错误输出重定向到一个名为 null
的文件,该文件存储在 /dev
.
下
为了回答您的问题,我建议您将输出重定向到一个您可以作为普通用户而非超级用户访问的文件夹。然后为确保一切正常,您可以打印此文件。
例如你可以这样做:
nohup Rscript GAM.R >/home/username/documents/output_file 2>&1 &
然后要从终端查看文件,您可以执行以下操作:
cat /home/username/documents/output_file
最后,如果您关闭电脑,我认为您的程序不会继续运行 运行,而且我认为没有办法做到这一点。
如果您想 运行 您的程序在后台运行并访问程序的输出,您可以通过编写
轻松实现
exec 3< <(Rscript GAM.R)
然后当你想检查程序的输出时运行
cat <&3 # or you can use 'cat /dev/fd/3'
太棒了!感谢大家提供有用的答案,特别是@Greg Tarsa。最终我需要使用:
$ nohup Rscript GAM.R >/usr/emily/gams/2017_03_14 2>&1 &
上面是用来运行脚本,把屏幕输出保存到emily/gams(叫“2017_03_14”,是命令做的文件,不是文件夹正如我最初的想法)。这还将我的 .rdata、.pdf 和 .jpg 输出文件从脚本输出到 usr/emily。
然后我可以看到进度和 运行ning 程序使用:
$ 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
我所知道的和我尝试过的: 我在 R 中有一个脚本(称为 GAM.R),我想 运行输出 .rdata、.pdf 和 .jpg 文件的背景。 运行 这从命令行相对简单:
$ Rscript GAM.R
但是,这段代码需要很长时间才能 运行 所以我很乐意将它发送到后台,即使在我注销并关闭计算机后也让它继续工作。我知道这也很简单,我的代码如下所示:
$ nohup Rscript GAM.R >/dev/null 2>&1 &
我用它来查看它是否有效:
$ fg
nohup Rscript GAM.R > /dev/null 2>&1
问题:我不知道如何检查代码是否正常工作(有没有办法让我看到它的进度?)而且我不知道在哪里输出正在进行中。我可以看到第一个代码的进度和输出,所以我不能离得太远。似乎第二个代码的输出没有到达第一个代码输出的位置。
您的命令行正在将所有输出转移到 /dev/null
也就是位桶。
考虑将其转移到临时文件中:
$ nohup Rscript GAM.R >/tmp/GAM.R.output 2>&1 &
然后可以tail /tmp/GAM.R.output
查看结果,默认会显示文件的最后10行。您可以使用 tail -f
显示文件结尾,并实时添加新输出。
请注意,/tmp/
文件系统不能保证在重新启动之间存在。您可以将文件放在其他地方(如果需要确定,例如 ~/GAM.R.output
。
但是请注意,如果您关闭计算机,所有处理都会中止。为此,您的机器必须继续 运行 而不是休眠或关机。
您所做的是,使用 >
将脚本的输出重定向到 /dev/null
,而通过执行 2>&1
,您将错误输出重定向到同一个地方.最后 nohup
执行您的进程并将其与当前终端分离。
总而言之,您正在做的是创建一个进程并将其输出和错误输出重定向到一个名为 null
的文件,该文件存储在 /dev
.
为了回答您的问题,我建议您将输出重定向到一个您可以作为普通用户而非超级用户访问的文件夹。然后为确保一切正常,您可以打印此文件。
例如你可以这样做:
nohup Rscript GAM.R >/home/username/documents/output_file 2>&1 &
然后要从终端查看文件,您可以执行以下操作:
cat /home/username/documents/output_file
最后,如果您关闭电脑,我认为您的程序不会继续运行 运行,而且我认为没有办法做到这一点。
如果您想 运行 您的程序在后台运行并访问程序的输出,您可以通过编写
轻松实现exec 3< <(Rscript GAM.R)
然后当你想检查程序的输出时运行
cat <&3 # or you can use 'cat /dev/fd/3'
太棒了!感谢大家提供有用的答案,特别是@Greg Tarsa。最终我需要使用:
$ nohup Rscript GAM.R >/usr/emily/gams/2017_03_14 2>&1 &
上面是用来运行脚本,把屏幕输出保存到emily/gams(叫“2017_03_14”,是命令做的文件,不是文件夹正如我最初的想法)。这还将我的 .rdata、.pdf 和 .jpg 输出文件从脚本输出到 usr/emily。
然后我可以看到进度和 运行ning 程序使用:
$ 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