linux 命令 抛后台,Linux 后台执行命令

本文详细介绍了如何在Linux环境中使用Python脚本进行后台执行,包括如何将输出重定向到文件,处理异常,保持程序在终端关闭后继续运行,以及如何管理后台进程,如挂起、恢复和终止进程。通过`nohup`、`&`、`jobs`、`fg`、`bg`和`kill`等命令,实现了对后台进程的有效控制。
摘要由CSDN通过智能技术生成

场景

python 代码,打印1~3000,每秒打印一次

## file_name: test.py

import time

i = 0

while 1:

time.sleep(1)

i = i + 1

print(i)

if i > 3000:

break

问题:直接在终端执行:python test.py, 需要在这个终端一直等,没法干别的事了。如何让代码在后端执行?

&——让命令后台执行

python test.py &

在命令后面加&,可以让命令在后台执行

问题:打印的东西还是会在终端显示,这明显干扰正常的工作啊,如何把打印的东西打打到指定的文件?

>——输出重定向

python test.py >out.txt &

这样就会把输出打印到out.txt

问题:如果中间发生了异常,错误信息就丢啦,比如下面的代码,如何把错误信息也打印到out.txt呢?

import time

i = 0

while 1:

time.sleep(1)

i = i + 1

print(i)

if i == 10:

i = i / 0

if i > 3000:

break

2>&1 ——将标准出错重定向到标准输出

python test.py > out.txt 2>&1 &

执行可以看到错误

2

3

4

5

6

7

8

9

10

Traceback (most recent call last):

File "test.py", line 8, in

i = i / 0

ZeroDivisionError: integer division or modulo by zero

欧耶,搞定,书归正传,把异常代码干掉继续

问题:关闭本终端,后台程序终止了,尴尬。如何在关闭本终端是程序可以依然执行

nohup——退出终端后,程序依然后台执行

nohup python test.py > out.txt 2>&1 &

关闭终端,再重新进入终端,可以可以看到进程是或者的,目前查看进程存活的方式是ps -ef | grep test。

问题:能否有专门的命令,看到所有后台执行的命令

jobs——查看后台执行的进程

$ jobs

[1]+ Running nohup python test.py > out.txt 2>&1 &

如果有多个呢?再起一个类似的后台进程test2, test3,另外把具体的pid也打出来

[1] 192415 Running nohup python test.py > out.txt 2>&1 &

[2]- 192646 Running nohup python test2.py > out.txt 2>&1 &

[3]+ 192647 Running nohup python test3.py > out.txt 2>&1 &

可以看到,[1][2][3]后面的状态是不同的,最后启动的放在最后边

问题:怎么把后台执行的命令重新调到前端执行呢?

fg——把后台执行的命令

$ fg

nohup python test3.py > out.txt 2>&1

可以看到调入前台重新执行的是[3]+, 状态是+的。 刚才jobs里的能否指定某一个呢,可以的

$ fg %1

nohup python test.py > out.txt 2>&1

注意:%1, 中间没有空格,1,就是上面的[1]编号

如何把调入前台执行的命令终止呢?Ctrl + C

问题:如何暂停某个进程?

Ctrl+z——暂停某个进程

目前在执行test, Ctrl+Z暂停,然后看看现在进程的状态

$ jobs

[1]+ Stopped nohup python test.py > out.txt 2>&1

[2]- Running nohup python test2.py > out.txt 2>&1 &

问题:如何继续执行暂停的进程

bg——继续执行后台暂停的进程

$ bg %1

[1]+ nohup python test.py > out.py 2>&1 &

t$ jobs

[1]- Running nohup python test.py > out.py 2>&1 &

[2]+ Running nohup python test2.py > out.py 2>&1 &

问题:是继续执行,还是重新执行呢?

继续执行,以下代码验证下

import time

import datetime

i = 0

while 1:

time.sleep(1)

i = i + 1

print(i)

now = datetime.datetime.now()

print(now.strftime('%a, %b %d %H:%M:%S'))

if i > 3000:

break

image-2.png

可以看到在打印到20后,是暂停的,后面执行时,数字接着执行,如果是这样感觉这个命令好强大

除了程序执行结束,如何杀死进程

kil——终止进程

根据jobs -l 得到的进程号,直接kill pid 或者 kill jobno (这里的jobno是[]中的数字)

一图总结上文

image-3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值