场景假设:在部署Python Flask项目到线上的时候,在Linux系统的虚拟环境中,运行项目可以正常访问到api,但是在Xshell中,一旦Ctrl+C或者关闭ssh,api接口停止了,api再也请求不到了。
此时我们可以:
假如我们要将python脚本的flask接口run.py部署到Centos环境的后台(即退出xshell等工具程序还可以继续运行)。
在 Linux 环境下,有时我们需要长时间运行一个程序,比如训练一个深度学习模型或者执行一些长时间的任务。在这种情况下,我们通常会使用后台运行的方式,以防止因终端关闭而导致程序中断。以下是关于如何在 Linux 下使用 sh, nohup, & 等命令后台运行 Python 脚本的详细解释。
一、nohub部署
1. 创建脚本 vi run.sh
首先,我们需要创建一个 shell 脚本来执行我们的 Python 脚本。这可以通过 vim 编辑器完成:
vi run.sh
2. 填写内容并保存
在编辑器中,输入以下内容:
#!/bin/bash
nohup python3 -u run.py > nohup.log 2>&1 &
echo "Script running in background with PID $!"
这里的解释如下:
- #!/bin/bash: 这行告诉系统这是一个 bash 脚本。
- nohup python3 -u run.py > nohup.log 2>&1 &: 这一行是关键命令,让我们逐个解析:nohup: 允许程序在用户退出后继续运行。
- python3 -u run.py: 执行名为 run.py 的 Python 脚本。-u 表示启用缓冲区的未缓冲模式,这对于实时输出很有用。
- > nohup.log: 将标准输出重定向到 nohup.log 文件。
- 2>&1: 将标准错误重定向到与标准输出相同的地方,即 nohup.log 文件。
- &: 将整个命令放入后台运行。
- echo "Script running in background with PID $!": 输出后台进程的 PID(进程标识号),以便于后续管理。
保存并退出编辑器(对于 vim,可以按 Esc 键,然后输入 :wq 并回车)。
3. 运行脚本
接下来,我们需要赋予 run.sh 脚本可执行权限,并运行它:
chmod +x run.sh
sh run.sh
或者可以直接运行:
./run.sh
- 输出示例如下:
可以发现脚本已经运行在后台了,脚本的进程号为144907。
说明:例如输出的进程pid为144907,如果后期不想让该项目运行在后台了,就可以通过kill -9 <pid>来结束运行,即此处应是kill -9 144907
但是请注意,如果你的脚本不在当前目录下,或者当前目录不在 PATH 环境变量中,你需要使用 sh run.sh 或者 bash run.sh 来执行。
4. 检查脚本是否正确启动
运行脚本后,检查 nohup.log 文件以确认脚本是否已正确启动:
cat nohup.log
- 输出日志如下:
可以看到项目运行的一些脚本情况。
二、相关说明
1. 关于 sh, source 和 .命令
- sh script.sh:使用 /bin/sh 解释器来执行脚本。这是最基本的 shell 解释器,适用于大多数 shell 脚本。
- bash script.sh:使用 /bin/bash 解释器来执行脚本。Bash 是一个功能更强大的 shell,支持更多的特性。
- source script.sh 或 . script.sh:这两种方式都会使当前 shell 会话读取并执行脚本的内容。这意味着脚本中的任何环境变量更改都会影响当前会话。
2. 后台执行命令:& 和 nohup
- &:将命令放入后台执行。当你关闭终端时,该命令会被终止。
- nohup:允许你在退出终端之后继续运行命令。配合 & 使用,可以确保即使你关闭终端,命令也会继续运行。