在服务器上跑深度学习代码,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