Press "Enter" to skip to content

有了 screen 和 nohup 跑深度学习代码再也不用愁了 | 退出终端不会影响服务器程序代码运行

在服务器上跑深度学习代码,xshell 断开代码就挂掉了。如何能在服务器运行程序的时候 即使关闭终端也不会影响代码呢?

 

screen

 

我用的是 screen。推荐这个方法,我感觉比 nohup 好用一万倍。

 

1. 连接服务器

 

下图我连接了 88 99 这个服务器。

 

2. 新建 session

 

在终端输入 screen -S 名称

 

然后它会关闭你当前窗口,弹出一个新窗口,可能选项卡名字叫 screen(我用的 xshell,不同软件可能有差异)。 你在新弹出的窗口 bash 代码.sh 运行你的程序就行了。

 

你可以直接关闭 xshell 等终端断开连接,去干别的事。

 

下图可以看到虽然选项卡名字变了,但它还是 88 99 服务器。

 

3. 挂起

 

如果你不需要断开连接,还想用服务器做别的事情,有两种方法:

 

Ctrl+ A + D

 

 

更简单的是你再开一个服务器窗口就行了。

 

 

直接在左边会话管理器那双击。现在 2 和 3 两个都是我当前的服务器。

 

4. 回到运行代码的 session

 

重连服务器之后如何找到我运行的代码?

 

如果你不记得之前 screen 创建 session 的叫什幺名,使用 screen -ls 查看列表。

 

比如下图显示我有一个 mydemo 被我 detach 了。然后看下一步。

 

如果你记得自己之前创建的 session 叫什幺名,你直接 screen -r 名字 ,就可以回到运行界面。

 

下图可以看到我的程序还在正常运行。

 

5 清除 session

 

 

如果你跑完代码了,这个 session 没用了。退出当前 session,然后 kill 就可以了。 看下图,这时候回话列表里显示我有 mydemo 这个还存在。黄色方块里直接杀掉这个进程就 OK 了。程序被杀就会死 ╭(●`∀´●)╯。

 

 

screen -wipe

 

下图可以看到,回话列表显示 mydemo 已经死了,黄色框框里将其清除,再看一下列表已经空了。

 

nohup

 

使用 nohup 是直接让代码后台运行,并且把运行日志输出。

 

1. 运行代码

 

进入到对应的文件目录,输入 nohup 要运行的文件 > 日志文件 2>&1 & 比如我要运行 /home/sian/test 下的 demo.sh 文件:

 

(如果遇到报错请拉到本文章最后)

 

解释一下上边这个语句的作用:

 

nohup demo.sh

 

运行 demo.sh 文件

 

如果只用这条语句会提示:

 

nohup: ignoring input and appending output to ‘nohup.out’

 

就是告诉你输出放在 nohup.out 文本中了。你 ls 看一下,运行目录下边会出现一个 nohup.out,运行结果都存放在这个文件里。

 

nohup demo.sh > train.log

 

运行 demo.sh,并把运行日志存储在 train.log 中。

 

运行之后会提示你:

 

nohup: ignoring input and redirecting stderr to stdout

 

就是把原来默认文件中的 stderr 和 stdout 重定位到你指定的新文件中了。

 

如下图,上边的 nohup.out 会变成我们指定的 train.log。

 

nohup demo.sh > train.log 2>&1

 

其中 2>&1 的作用是“redirecting stderr to stdout ”,也就是将标准错误重定向到标准输出,再把标准输出重定向输入到 train.log 文件中。

 

加了 2>&1 之后就不会有“redirecting stderr to stdout”这条提示了。

 

如果你不加那个 & ,只写 2 > 1 会生成两个文件,一个是 1,一个是 train.log,1 中会存输出的警告和错误。

 

2 代表 stderr(standard error,标准错误输出)

 

1 代表 stdout (standard output,标准输出)

 

nohup demo.sh > train.log 2>&1 &

 

最后这个 & 的意思是在后台执行。

 

举个例子:

 

如果你不加这个 & ,执行如下,代码不运行完就会一直停留在这个界面,你这个终端窗口无法继续使用。

 

加`&`之后,直接执行程序,**并把程序丢到后台**,不影响当前终端窗口的使用,也可以直接退出服务器连接。

 

2. 查看日志

 

一般会在你运行目录下边生成运行日志,找到文件直接用`tail -f train.log`打开文件即可。

 

3. 停止运行

 

如果要停止运行,你需要使用 ps -aux | grep "运行文件名" (或者 ps -def | grep "运行文件名" )找到 nohup 运行脚本的 PID,然后使用使用 kill -9 PID 来删除。

 

4. 报错怎幺办

 

显示找不到执行文件

 

nohup: failed to run command ‘demo.py’: No such file or directory

 

第一步,尝试修改指令

 

在我电脑上直接 nohup 文件名 ... 会一直报错说找不到文件。 我需要 nohup bash xxx.sh 或者 nohup python xxx.py ,需要加上普通执行的前缀才不会报错,你可以试一下。

 

第二步检查你是不是进错目录了。

 

举个例子:

 

你要运行 /home/sian/test 下的 demo.sh,你一定要进到 test 文件下边,或者执行的时候指定路径。

 

下图 1,我进入到 test 文件夹执行,执行时候直接写文件名就:ok:,生成的执行日志文件也在 test 目录下。

 

下图 2,我在 sian 文件夹中执行,执行之后需要填好文件的地址,生成的日志会在 sian 文件下。

 

如果确认地址没问题, 第三步查看待执行文件的权限,如果文件没有执行权限,打开执行权限就好了。

 

举个栗子:

 

 

ll 查看权限,看到下图显示的文件权限中没有 -x 这一项,就证明是没权限导致的。

 

 

chmod a+x

 

可以看到下图中添加执行权限之后已经显示出来 -x 了。再回去执行文件问题就解决了。

 

如果上边两步都没问题,还是不好使,那你就百度吧!

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注