Linux、Windows后台运行Python脚本

Linux:python或nohup命令

python命令:

python test.py &

python -u test.py >> test.log &

参数u,时时输出内容到文件。

python -u test.py >>test.log 2>&1 &

python -u test.py >>/dev/null 2>&1 &

1 表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息
/dev/null 是linux下的一个设备文件,这个文件类似于一个垃圾桶,特点是:容量无限大

基本用法:

1.nohup python3 test.py &

后台使用Python3运行test.py文件,日志默认输出到当前目录nohup.out或~/nohup.out文件。

2.nohup python3 test.py >> nohup.out 2>&1 &

后台使用Python3运行test.py文件,日志全部输出到当前目录nohup.out文件。

3.查看所有Python3进程

ps -ef | grep python3

Linux系统后台运行操作步骤如下:

1.第一种方法是直接用unhup命令来让程序在后台运行,命令格式如下:

unhup python 文件名.py (> ***.log )&

在这个命令中,python指定我们要执行的文件为python文件,后面的文件名.py即是我们要执行的文件。括号内容表示可以将平时输出到控制台中的内容重定向到*.log这个文件中,这个是可选的,如果没有这个,则会默认输出到nohup.out文件中。括号后面你的&表示后台运行。

2.第二种方法是写一个脚本,然后把脚本提交给服务器,让服务器在后台运行脚本里面的语句。假设我们定义了一个脚本start.sh,其内容如下:

#!/bin/bash

cd 想要运行文件的路径名

python -u ***.py

上述脚本中,#!/bin/bash是指此脚本使用/bin/bash来解释执行下面的语句,其中cd是表示将当前目录跳到所要运行文件所在目录,然后python -u ***.py则表示运行***python文件,当写完该脚本后,我们就可以使用下面的这条命令来执行该脚本从而让程序在后台运行:

./start.sh > result.log &

在这里./start.sh表示运行当前目录下的脚本start.sh,> result.log表示把原来输出到控制台的东西都输出到result.log文件中,&表示在后台运行

我们通过ps -e命令可以查看后台运行的进程都有哪些

Windows:pythonnw命令

python安装目录中,大家会发现目录中有python.exe和pythonw.exe两个可执行文件。

 

python.exe在运行程序的时候,会弹出一个黑色的控制台窗口(也叫命令行窗口、DOS/CMD窗口)

pythonw.exe是无窗口的Python可执行程序,意思是在运行程序的时候,没有窗口,代码在后台执行

 方式一:会弹出一个黑色的控制台窗口,并可以实时查看输出日志

方式二:没有窗口,代码在后台执行

1.pythonw app.py

后台使用Python运行test.py文件,无日志输出。

2.pythonw app.py > python.log

后台使用Python运行app.py文件,日志输出到当前目录python.log文件。

3.查看windows下所有进程:tasklist

4.指定进程号或名称杀死进程:taskkill /f /t /pid  进程号

注意:

由上图可以看到pythonw程序对应的有四个不同的pid号,很难确定要杀掉哪个pid,如果后台用pythonw指令启动的程序多的时候,这样区分难度就加大了

为了解决这一问题,最好是创建bat脚本执行。

操作步骤如下

启动程序脚本:在venv同目录位置新建start.bat脚本

@echo off
call venv\Scripts\activate.bat
pythonw app.py >python.log
exit

关闭程序脚本:在venv同目录的位置新建shutdown.bat脚本(CommandLine like '%%pythonw app.py%%必须与start.bat中启动的指令一致)

@echo off
wmic process where "CommandLine like '%%pythonw  app.py%%' and name='pythonw.exe'" get processid,commandline >pid.txt
for /f "tokens=2 delims===" %%i in ('type pid.txt^| findstr "ProcessId="') do (taskkill /f /t /pid %%i)
pause

相关资源:

http://www.dcsdn.com/doc/do-3728
http://www.dcsdn.com/doc/do-3662
http://www.dcsdn.com/doc/d-3573

https://blog.csdn.net/m0_67505824/article/details/123400192

posted @ 2023-04-05 17:14  浩浩学习  阅读(1164)  评论(0编辑  收藏  举报