ubuntu后台运行与查看程序的多种详细方法
方法1:使用&
方法2:使用nohup
方法3:使用nohup与&组合等(见nohup中第6部分的示例介绍)
一.使用&
一般在执行shell命令的时候我们在命令的后面加上一个‘&’,这样就可以使得该程序在后台运行。
python A.py &- 但是&有一定局限性:
当程序运行起来之后依旧会再次在shell中输出打印信息,shell依旧被占用,关闭shell则程序退出;这个时候我们可以使用ctrl+z命令,使得这个信息消失,可以做别的事情,但是关闭shell的时候程序依旧会退出,因此这些办法都不能解决问题。
由此需要nohup来解决
二.nohup的介绍与使用
1.简介
nohup的意思就是:永久执行,是no hang up的缩写,指不间断,不挂断。运行一个进程的时候,**不想让其在你退出账号时关闭,即可用nohup。**nohup用于不挂断地运行命令。nohup在不规定的情况下,所以输出内容会到nohup.out中。
nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响运行,注意了nohup没有后台运行的意思;&是指在后台运行,但当用户退出(挂起)的时候,命令自动也跟着退出。
2.用法
语法如下:
nohup Command [ Arg … ] [ & ]Command:要运行的命令。Arg:命令的参数。&:将命令放在后台执行
例如,你可以使用 nohup 命令运行一个长时间运行的任务,让它在后台持续运行而不受终端关闭的影响。示例:
nohup python A.py &
这将在后台运行 ./A.py 脚本,并且即使你关闭终端,该脚本也会继续运行。
-
问
- 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。这句话对吗
-
答
- 是的,这句话是正确的。当使用
nohup命令时,无论是否将输出重定向到终端,输出都将附加到名为nohup.out的文件中。如果当前目录的nohup.out文件不可写,输出将被重定向到用户的家目录下的nohup.out文件中。这样可以确保即使用户退出登录或关闭终端,命令的输出仍然会被保存在文件中。
- 是的,这句话是正确的。当使用
-
问
- 退出状态出口值:
126可以查找但不能调用 Command 参数指定的命令。127nohup 命令发生错误或不能查找由 Command 参数指定的命令。否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
- 退出状态出口值:
-
答
- 这个描述是正确的。
- 如果 nohup 命令返回退出状态值 126,则表示能够找到指定的命令,但无法调用该命令。
- 如果 nohup 命令返回退出状态值 127,则表示 nohup 命令本身发生错误或无法找到指定的命令。
- 否则,nohup 命令的退出状态将是由
Command参数指定命令的退出状态。
- 这个描述是正确的。
3.由此可知nohup和&一起使用最优
三.指令
1.操作系统中有三个常用的流
| 0 | 标准输入流 stdin,用户键盘输入的内容 |
|---|---|
| 1 | 标准输出流 stdout ,输出到显示屏的内容 |
| 2 | 标准错误流 stderr,报错内容 |
2.2>&1
-
2>&1是一个整体,是将标准错误(2)重定向到标准输出(&1),即将错误内容重定向输入到标准输出中去。 -
在命令行中,
&1表示文件描述符1,即标准输出。在重定向输出时,&符号用于指定文件描述符,而不是文件名。所以2>&1表示将标准错误输出重定向到标准输出。这种写法可以确保标准错误输出与标准输出都输出到同一个地方,便于查看和处理。 -
另外,需要注意的是,
&1通常与>或>>一起使用,例如2>&1或1>&2。而当单独使用时,&1不会产生任何效果,因为缺少指定的输出方向。
3.示例介绍
nohup python A.py >> /home/my.log 2>&1 &nohup:表示后台运行命令并忽略挂断信号。python A.py:要运行的命令,这里是执行 Python 脚本A.py。>> /home/my.log:将标准输出追加到文件/home/my.log中,>>表示追加模式,如果文件不存在将会创建,如果文件已经存在则将输出追加到文件末尾。2>&1:将标准错误重定向到标准输出,这样标准错误输出也会被追加到/home/my.log文件中。&:使命令在后台执行。
综合起来,这条命令的作用是在后台运行 Python 脚本 A.py,将标准输出和标准错误输出都追加到文件 /home/my.log 中。这样即使终端关闭,脚本的输出也会被保存到指定的日志文件中,方便后续检查日志。
3.1追加解释
上面的指令可以拆分
nohup python A.py 1>> /home/my.log &
nohup python A.py 2>> /home/my.log &这两条命令可以转换成使用不同方式进行标准输出和标准错误输出的重定向:
nohup python A.py 1>> /home/my.log &:将标准输出追加到文件/home/my.log中。其中,1>>表示将标准输出重定向并追加到指定文件。nohup python A.py 2>> /home/my.log &:将标准错误输出追加到文件/home/my.log中。其中,2>>表示将标准错误输出重定向并追加到指定文件。
这样的设置可以让标准输出和标准错误输出分别保存在同一个文件中,并且分别进行追加,更加直观地区分错误信息和输出信息。
3.2关闭缓冲时时同步日志文件
nohup python -u A.py >> /home/my.log 2>&1 &-
在这条命令中,
-u选项是用来关闭 Python 的输出缓冲的。这样可以让 Python 脚本的输出实时地写入到日志文件/home/my.log中,而不会等到缓冲区满才写入。这对于实时查看脚本输出非常有用,尤其是在日志分析和故障排查时。 -
另外,
>> /home/my.log仍然表示将标准输出追加到文件/home/my.log中,2>&1则表示将标准错误输出重定向到标准输出,实现将标准输出和标准错误输出都输入到同一个日志文件中。 -
整个命令的作用是后台运行 Python 脚本
A.py,实时将标准输出和标准错误输出写入到/home/my.log日志文件中。
3.3覆盖
nohup python A.py > /home/my.log 2>&1 &这条命令与之前的命令略有不同,具体解释如下:
nohup python A.py:表示在后台运行 Python 脚本A.py,并忽略挂断信号。> /home/my.log:表示将标准输出重定向到文件/home/my.log中,>表示覆盖模式,即如果文件不存在则创建,如果文件已经存在则覆盖文件内容。注意,这里只重定向了标准输出,并没有重定向标准错误。2>&1:表示将标准错误输出重定向到标准输出,确保标准错误输出也输出到/home/my.log文件中。&:使命令在后台执行。
由于>是覆盖所以一般不建议使用
四.查看后台进程
1.ps(推荐)
Process State 是非常强大的进程查看命令,用于报告当前系统的进程状态。直接输入ps便可查看,ps还有许多功能,比较常用选项:
BSD风格
a——和终端有关的进程
x——和终端无关的进程
u——显示进程的执行者
sys V风格
-e——查看所有进程
-l——long,长格式
-f——full,详细信息
-o——指定输出格式
常用命令
ps #查看隶属于自己的进程
ps -l(ps -u)#仅查看隶属于自己进程的详细信息
更多课参考https://blog.csdn.net/wsxxdwwzjdy/article/details/78507698
-
问
- 1058470这是进程id怎么找到该进程在Ubuntu中
-
答
-
在Ubuntu中,你可以使用
ps命令来查找特定进程的信息。你可以在终端中输入以下命令来查找特定进程ID为1058470的进程:ps -p 1058470这将显示具有进程ID为1058470的进程的详细信息,包括进程状态、运行时间等等。
root@iZbp1b7wzhw2hhqiixdpdwZ:~# ps -p 1058470 PID TTY TIME CMD 1058470 pts/4 00:00:12 java
-
2.top
top是一个交互式系统性能监控工具,不同于ps是静态的结果输出,top可以实时动态地查看系统的整体运行情况。 通过top命令所提供的互动式界面,用热键可以管理。
toproot@iZbp1b7wzhw2hhqiixdpdwZ:~# top
top - 14:18:35 up 47 days, 5:52, 2 users, load average: 0.05, 0.04, 0.03
Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 1.3 sy, 0.0 ni, 97.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1685.0 total, 106.1 free, 825.2 used, 753.8 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 669.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
151564 root 20 0 152440 49640 15964 S 2.7 2.9 91:24.79 AliYunDunMonito
1046361 root 20 0 17736 11744 8768 S 0.7 0.7 0:20.08 sshd
142832 mysql 20 0 1829228 424524 26552 S 0.3 24.6 65:38.52 mysqld
151520 root 20 0 32156 5568 4736 S 0.3 0.3 6:58.47 AliYunDunUpdate
151553 root 20 0 88396 14644 12188 S 0.3 0.8 46:37.63 AliYunDun
1046569 root 20 0 11528 4864 3108 S 0.3 0.3 0:04.75 top
1058470 root 20 0 2971564 176016 28496 S 0.3 10.2 0:12.59 java
1 root 20 0 102108 11168 6324 S 0.0 0.6 8:30.80 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.35 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 slub_flushwq
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
10 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_rude_
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_trace
13 root 20 0 0 0 0 S 0.0 0.0 0:27.95 ksoftirqd/0
14 root 20 0 0 0 0 I 0.0 0.0 10:10.26 rcu_sched
15 root rt 0 0 0 0 S 0.0 0.0 0:10.50 migration/0
16 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/0
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
20 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/1
21 root rt 0 0 0 0 S 0.0 0.0 0:10.03 migration/1
22 root 20 0 0 0 0 S 0.0 0.0 0:25.00 ksoftirqd/1
24 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-events_highpri
25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
26 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 inet_fra- 问
- 可以用top过滤吗
- 答
- 是的,你可以使用
top命令来过滤进程并找到特定进程ID为1058470的进程。在top命令界面中,按下O键(大写字母O)可以打开过滤器功能。然后输入PID=1058470并按下回车键。这将只显示具有进程ID为1058470的进程。
- 是的,你可以使用
top - 14:20:53 up 47 days, 5:54, 2 users, load average: 0.00, 0.02, 0.02
Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 1.5 sy, 0.0 ni, 97.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1685.0 total, 103.8 free, 827.4 used, 753.8 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 667.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1058470 root 20 0 2971564 176756 28496 S 0.0 10.2 0:12.74 java 五.结束后台运行程序
结束后台运行的程序可以通过以下方法来实现:
-
使用
ps命令查找程序的进程号(PID):ps aux | grep <程序名称>通过上述命令可以找到程序的 PID。
-
使用
kill命令结束程序:kill <PID>或者使用强制结束的方式:
kill -9 <PID>使用以上命令可以向指定的进程发送信号,终止程序的运行。常用的信号包括:
- 15(SIGTERM):这是默认的终止信号,程序可以捕获并进行清理操作。
- 9(SIGKILL):这个信号会立即终止进程,进程无法捕获并处理该信号。
另外,如果程序是后台运行的,并且你是通过 nohup 的方式运行的,也可以直接使用 killall 命令结束程序:
killall <程序名称>
需要注意的是,在使用 kill 或 killall 命令结束程序时要小心,确保你终止的是正确的进程,避免误操作导致数据丢失或系统异常。