测试c代码
#include <stdio.h>
#include <unistd.h>
int main() {for (int i;; ++i) {printf("b数值 %d\n", i);fflush(stdout);sleep(3);}
}
使用Ctrl+Z可以将当前正在运行的程序放到后台并暂停它。如果你想要继续这个暂停的程序,可以使用fg命令将它重新切换到前台运行。如果想要在后台继续运行,就用 bg命令。
用&结尾
./b.out &
& 命令会将 b.out 放到后台运行,但是仍然与当前终端关联。这意味着,如果你关闭了当前终端,该命令可能会收到 SIGHUP(挂起信号)并终止。
./b.out > /dev/null 2>&1 &
这种方式将程序的标准输出和标准错误输出重定向到 /dev/null,即丢弃输出,使程序在后台运行。
使用nohup命令
nohup ./b.out &
nohup命令可以让程序忽略挂断信号(SIGHUP),并将程序的标准输出和标准错误输出重定向到一个文件中(默认是当前目录下 nohup.out 文件)。
&表示程序放到后台运行,nohup表示忽略挂断信号,退出终端不影响。
如果你希望自定义 nohup 命令的输出文件,可以使用重定向符号 > 或 >> 来指定输出文件的名称或路径。这样可以将程序的标准输出和标准错误输出重定向到你指定的文件中。
# 如果 custom_output.log 文件不存在,将会创建该文件;如果已存在,则会覆盖文件内容。
nohup ./b.out > custom_output.log &
# 将输出追加到已存在的文件末尾,可以使用 >> 符号。
nohup ./b.out >> custom_output.log &
使用disown命令
在程序已经在前台运行时,可以使用disown命令将其移到后台运行。
./b.out
# 按下 Ctrl+Z 暂停程序
bg # 将程序移到后台运行
disown # 断开程序与终端的关联
disown 命令用于断开一个已经在后台运行的命令或作业与当前终端的关联,使得该命令不再受终端关闭的影响。使用 disown 命令后,命令的输出将不会被保存到 nohup.out 文件中,而是丢失。
对于自定义输出并不影响,断开终端后依然会持续输出。
./b.out > output.txt 2>&1 &
disown
这样会将 b.out 程序放到后台运行,并且不再与当前终端关联,终端关闭后程序继续在后台执行。
当然可以直接把命令写在同一行,这样直接就是后台运行,并断开了与当前终端的关联。
./b.out > output.txt 2>&1 & disown
结束后台程序
使用 Ctrl+C 并不能直接终止程序,因为 Ctrl+C 通常是用来发送中断信号(SIGINT)给前台进程的,而你的程序此时是在后台运行的。
方法1:使用 fg 将程序切换到前台运行,然后再使用 Ctrl+C 终止程序。
如果你多次执行 ./b.out > output.txt 2>&1 &
启动了多个后台进程,那么当你使用 fg
命令时,默认会将最后一个放入后台的进程调至前台。这是因为 fg
命令通常会作用于最近的或者指定的后台进程。如果要指定具体的后台进程,可以使用 %
后跟进程号或者任务号,例如 %1
、%2
等。
如果你需要查看当前所有后台任务的信息,可以使用 jobs
命令列出,并查看任务号,然后再使用 fg %任务号
将指定任务调至前台。
如果你在断开终端后再次进入时,使用 fg 命令无法将之前在后台运行的进程调至前台,这通常是因为断开终端会导致与后台进程的控制终端断开联系,从而失去了对进程的控制能力。
这时也可以用jobs命令获取任务号,然后 `fg %任务号 将指定任务调至前台。
方法2:使用 kill 命令发送信号给后台进程:
首先,可以使用 ps 命令查找进程的 PID(进程号):
ps aux | grep b.out
找到对应的进程号,然后使用 kill 命令发送 SIGINT 信号(通常是 Ctrl+C 发送的信号):
kill -SIGINT PID
其中 PID 是你找到的进程号。
注意:如果程序在后台运行,但输出在终端,可能导致结束命令还没输完就被刷新屏幕了。可以先把命令写到记事本上,然后复制到终端。
方法3:使用 pkill 或 killall 命令:
pkill b.out
#or
killall b.out
默认情况下,pkill 会终止所有匹配条件的进程,可以使用 -n 选项来指定只终止最早匹配的一个进程。
测试下来匹配到的是最后一个开启的程序。
pkill -n b.out
pkill 命令并不支持仅匹配前几个的选项,要么终止一个,要么终止全部。
killall 命令总是终止所有匹配的进程。