笔者现在有一个需要执行大概300小时CPU时间的湍流算例(改并行还很麻烦只能先跑单核看看结果对不对),之前在服务器上跑程序都是直接类似PC跑程序一样./a.out
运行。但是这样关闭shell之后,服务器会自动kill
算到一半的程序,程序执行中途网络还不能中断。所以这个新的程序就需要进行后台提交,此处记录一下网上学习到的内容。
nohup 和 &
首先使用这两个命令就能将最简单的程序放到后台计算了,命令如下:
nohup ./a.out &
回车之后,终端会输出一个进程号:
这里的36010就是进程号了。然后来解释一下这两个命令分别的作用。
首先&
是指在后台运行,./a.out &
也能够执行,回车之后也会返回一个进程号,但是这个进程在关闭终端之后会被kill
掉。
第二个命令就是nohup
,为no hang up的缩写,意思就是不挂断的运行。两者组合使用后,相当于直接在后台挂上了一个不会挂断的程序。另外还输出了一行字:
nohup: ignoring input and redirecting stderr to stdout
意为忽略输入,并将stderr
输出到stdout
,就是把终端本来应该显示的输出输出到指定的文件中。如果不进行重定向直接用命令nohup ./a.out &
,输出结果为
nohup: ignoring input and appending output to 'nohup.out'
就是同样忽略输入,并将输出保存到nohup.out
中。
重定向
重定向是将程序的输出导入到文件中,或将文件的文本导入到程序中。使用方法主要通过指令>
和<
,前者是将输出保存,后者是导入文件。例如
nohup ./a.out >logout &
是挂起的同时,指定输出到文件logout中。当然这个用法也适用于其他命令,比如说:
ls > list.txt
是将ls
命令的输出导入到list.txt
文本中。重定向也可以导入文本,但是此处的导入是指,当程序运行需要终端交互时的情形,比如说程序中有:
scanf("%d%d",&a,&b);
此时,创建一个文本data.txt
2 3
就可以用:
./a.out < data.txt
避免直接的输入。
此处强调一点,笔者的程序需要先从当前文件夹内读取网格数据和控制参数,这一步骤并不是前面提到的终端交互输入的数据,并不需要写成类似如下的形式,否则会报错:
nohup ./a.out <control.in Mesh2d.dat >logout &
最后,报错结果也可以存储,要使用2>
,例如:
nohup ./a.out >logout 2>/dev/null
意为一般的输出保存在logout
中,报错的输出就不要了23333