linux, 两种方法轻松让程序脱机运行在服务器

1. 引言

对于深度学习,目前我们都是在本地写代码,然后通过ide(如pycharm)连接服务器,将代码和数据传输上去,然后在ide中运行代码,即可在服务器上跑程序了。pycharm连接服务器请看此博文pycharm连接服务器

如果仅仅是这样,那么本地的电脑已关闭,服务器上跑的程序就关闭了。

那么怎样关闭本地电脑,同时服务器上面又可以继续跑程序呢?有两种方法,请看下文。

2. 环境

本地IDE是:PyCharm 服务器是Linux系统

3. 方法介绍

3.1 方法一:使用screen

(1)服务器上screen的安装

Step1: 检测有无安装screen 使用命令:

bash 复制代码
screen -ls

查看是否有无screen,如报错,说明没有安装screen. Step2: 连接上远程服务器,使用命令安装screen

arduino 复制代码
CentOS 系列系统: yum install screen
Ubuntu 系列系统: sudo apt-get install screen

(2) 使用screen使得服务器不依赖本地电脑而运行

Step0: 测试代码介绍

lua 复制代码
import time
import datetime
import os

time.sleep(20)
data_path = "../data/"
# 1. 创建文件对象
file_name = os.path.join(data_path, 'test_screen.txt')
file = open(file_name, mode='w')
file.writelines(str(datetime.datetime.now()))
file.close()

for i in range(30):
    time.sleep(5)
    print("the number is = ", i)

(1)延长20秒后,将当前时间写入到txt文件中。(方便观察脱机后,是否成功运行) (2)每延时5秒,输出一段文字。(方便再进入程序时,观察程序是否还在运行)

Step1: 连接远程服务器 无论使用pycharm还是Xterm或是其他软件,连接上远程服务器即可。 之后的步骤,可借鉴:使用screen实现服务器独自跑项目

Step2: 创建一个screen

ruby 复制代码
(base) git@ecs-1a2b-12345678:~# screen -S test

Step3: 查看刚才创建的screen

bash 复制代码
(base) git@ecs-1a2b-12345678:~# screen -ls
There are screens on:
        14154.test      (03/29/2020 11:01:58 AM)        (Attached)
1 Sockets in /run/screen/S-git.

Step4: 切换路径到文件所在位置

ruby 复制代码
(base) git@ecs-1a2b-12345678:~# cd /home/folders/Fiona/program

Step5: 激活自己的环境

ruby 复制代码
(base) git@ecs-1a2b-12345678:/home/folders/Fiona/program# conda activate Fiona0329

Step6: 运行代码

ruby 复制代码
(Fiona0329) git@ecs-1a2b-12345678:/home/folders/Fiona/program# python run.py

Step7: 按ctrl+a+d,退出screen。然后就可以关闭本地电脑了,服务器此时会自己运行程序 我这里就直接把pycharm关闭了。运行完后,重新进入到之前创建的screen,查看程序运行结果。

Step8: 重新打开screen (1) 先使用命令找到之前创建的screen: (2) 重新打开screen

csharp 复制代码
(base) git@ecs-1a2b-12345678# screen -r 15659.test

此时就可以查看之前运行代码的结果了,如图所示: 器此时会自己运行程序**

结果展示 完成上面的步骤后,我直接关闭pycharm。过一段时间,我再进入创建的screen,发现程序已运行完成,内容也写入成功,输出也正确。具体如图: 结果非常满意,在我关闭本地电脑后,服务器依旧能够自行运行程序,并输出结果。重新进入到运行的界面后,也能看到程序输出的结果,完美!

Step9: 删除screen 删除之前先找到要删除的screen: 然后进行删除:

csharp 复制代码
(base) git@ecs-1a2b-12345678# screen -X -S 16283.you quit

删除后,再查看,就没有被删除的screen了:

3.2 方法二: 使用nohup

(1)nohup用途:

不挂断的运行命令

(2)nohup和&的关系

使用nohup运行程序:

  1. 输出重定向,默认重定向到当前目录下 nohup.out 文件
  2. 使用 Ctrl + C 发送 SIGINT 信号,程序关闭(即:后台运行时,在终端使用Ctrl+C可以终止程序)
  3. 关闭 Shell Session 发送 SIGHUP 信号,程序免疫

使用&运行命令:

  1. 程序转入后台运行
  2. 结果会输出到终端
  3. 使用 Ctrl + C 发送 SIGINT 信号,程序免疫(即:后台运行时,在终端使用Ctrl+C不可以终止程序)
  4. 关闭 Shell session 发送 SIGHUP 信号,程序关闭

往往是两者一起结合使用,使用实例如下:

bash 复制代码
# 方式1:最简单的后台运行
# 输出默认重定向到当前目录下 nohup.out 文件
nohup python main.py &  

# 方式2:自定义输出文件(标准输出和错误输出合并到 main.log)
nohup python main.py >> main.log 2>&1 & 
# 与上一个例子相同作用的简写方法
nohup python main.py &> main.log &

# 方式3:不记录输出信息
nohup python main.py &> /dev/null &

# 方式4:不记录输出信息并将程序的进程号写入 pidfile.txt 文件中,方便后续杀死进程
nohup python main.py &> /dev/null & echo $! > pidfile.txt

(3)如果中途需要输入

在使用nohup时,如果命令运行中间需要输入类似"yes | no"这样的确认命令时,显然我们不能想screen那样打开界面进行输入的,但nohup也有解决方式,如下所示:

powershell 复制代码
yes | nohup pip install torch > install.log 2>&1 &

上面的代码是安装torch,安装torch时,一般都会有一个yes | no的确认步骤,此时前面的yes就是表示当出现这种选择时,直接选择yes。

如果有多个输入时,可以按如下示例操作: 下面是脚本文件:

powershell 复制代码
#!/usr/bin/expect

spawn pip install torch
expect "Do you want to continue? (yes/no)"
send "yes\r"
expect "Another confirmation prompt"
send "yes\r"
# 添加更多的 expect/send 根据需要
expect eof

下面是命令行运行命令:

powershell 复制代码
nohup expect install_torch.exp > install.log 2>&1 &

其中,spaw和expect命令解释如下:

spawn:用于启动一个外部程序(如 pip install 命令),它会创建一个新的进程并使脚本与该进程进行交互。 expect:用于等待外部程序输出特定字符串或提示。它会监控程序的输出,当检测到指定字符串时,脚本将继续执行。

查询当前运行的进程:

bash 复制代码
jobs -l

杀死对应进程:

bash 复制代码
kill -9 进程号		# 如: kill -9 12345

以上就是两种脱机运行的方式! 完结,撒花!!

相关推荐
qq_2430507941 分钟前
dnsmap:DNS枚举 详细完整教程 Kali Linux&Termux入门教程 黑客渗透测试 信息收集
linux·网络·安全·web安全·网络安全·系统安全·ddos
Pou光明4 小时前
1_linux系统网络性能如何优化——几种开源网络协议栈比较
linux·运维·网络·网络协议·开源
TianyaOAO5 小时前
inmp+discuz论坛
linux·运维·服务器
星光璀璨山河无恙5 小时前
【Linux】grep命令
大数据·linux
稳联技术6 小时前
科技潮头浪接天,一桥飞架两界连。EthernetIP转Profinet互译连
linux·服务器·网络
dessler7 小时前
vmware-esxi使用指南
linux·运维·云计算
明金同学8 小时前
腾讯云海外服务器Window切换为linux系统(从Window DD 到 Linux)
linux·服务器·腾讯云
CC大煊9 小时前
【Linux】vi/vim 使用技巧
linux·运维·vim
是十一月末9 小时前
Linux的基本功能和命令
linux·服务器·开发语言·数据库
暮已深10 小时前
【RTAB-Map+VINS-Fusion+euroc】(Ubuntu 20.04)三维稠密重建-实践笔记
linux·笔记·ubuntu