菜鸟科技网

命令行如何让程序在后台运行?

在Linux和Unix-like系统中,命令行是用户与系统交互的核心方式,而“后台运行”则是命令行操作中一项非常实用的功能,它允许用户将需要长时间执行的进程放置在后台执行,从而释放终端,继续进行其他操作,本文将详细介绍命令行后台运行的相关概念、操作方法以及注意事项。

命令行如何让程序在后台运行?-图1
(图片来源网络,侵删)

我们需要理解什么是前台进程和后台进程,前台进程是指那些直接与用户终端交互的进程,它们的输出会直接显示在终端上,并且会占用终端的输入,当我们在终端中输入ls -l命令后,这个命令就会在前台执行,直到执行完毕,终端才会返回命令提示符,等待下一个命令,而后台进程则是在后台运行的进程,它不与终端直接交互,用户可以在终端继续输入其他命令,后台进程的输出默认情况下不会显示在终端上,而是会被重定向到某个文件或被丢弃。

要将一个命令放到后台运行,最基本的方法是在命令的末尾加上&符号,如果我们想要在后台执行一个名为long_running_script.sh的脚本,可以使用命令./long_running_script.sh &,当使用&符号时,终端会立即返回命令提示符,而不会等待该脚本执行完毕,终端会显示该进程的进程ID(PID),例如[1] 12345,其中[1]是作业编号,12345是进程ID,这个作业编号和PID在后续管理后台进程时会非常有用。

除了使用&符号将命令直接放入后台运行外,我们还可以使用Ctrl+Z组合键将一个正在前台运行的进程暂停,并将其放入后台,当我们运行一个交互式命令如vim file.txt后,如果想要切换到其他任务,可以按下Ctrl+Z,此时终端会显示[1]+ Stopped vim file.txt,表示该进程已经被暂停并放入后台,需要注意的是,被Ctrl+Z暂停的进程处于“Stopped”状态,它并没有在执行,只是被挂起了,如果要让它在后台继续运行,可以使用bg命令,例如bg %1%1表示作业编号为1的作业),这样,该进程就会在后台继续执行,其状态会从“Stopped”变为“Running”。

管理后台运行的进程,我们需要使用一些内置的shell命令。jobs命令用于查看当前终端会话中的所有后台作业及其状态。jobs -l会显示作业编号、进程ID、状态和命令。fg命令用于将一个后台作业调回前台运行,例如fg %1会将作业编号为1的作业调回前台,如果后台作业正在运行,我们可能希望将其终止,可以使用kill命令,例如kill %1kill 12345,如果kill命令无法终止进程,可以使用kill -9 %1kill -9 12345,强制终止该进程。

命令行如何让程序在后台运行?-图2
(图片来源网络,侵删)

在后台运行进程时,还有一个非常重要的问题需要考虑,那就是输入输出重定向,默认情况下,后台进程的输出(标准输出和标准错误)仍然会尝试写入终端,这可能会导致终端输出混乱,通常建议在后台运行进程时,对输出进行重定向。./script.sh > output.log 2>&1 &,这条命令将标准输出重定向到output.log文件,并将标准错误也重定向到标准输出(即output.log文件)。2>&1表示将文件描述符2(标准错误)重定向到文件描述符1(标准输出)的当前位置,这样,所有的输出都会被写入到output.log文件中,而不会干扰终端的显示,同样,后台进程的输入也应该被重定向,通常是从/dev/null读取,例如./script.sh < /dev/null > output.log 2>&1 &,这样可以避免后台进程意外等待终端输入。

下面是一个关于后台运行命令及其管理的简单表格总结:

命令 功能描述 示例
command & 在后台启动一个命令,并显示作业号和PID sleep 100 &
Ctrl+Z 暂停当前前台运行的进程,并将其放入后台 (在运行vim时按下Ctrl+Z
bg [%jobnumber] 将一个暂停的后台作业继续在后台运行 bg %1
fg [%jobnumber] 将一个后台作业调回前台运行 fg %1
jobs [-l] 查看当前终端会话中的所有后台作业及其状态 jobs -l
kill [%jobnumber/PID] 终止一个指定的后台作业或进程 kill %1kill 12345
kill -9 [%jobnumber/PID] 强制终止一个指定的后台作业或进程 kill -9 12345
nohup command & 在后台运行一个命令,并且使用户退出后该进程仍能继续运行 nohup sleep 100 &

nohup(no hang up)是另一个与后台运行密切相关的命令,当用户退出终端会话时,系统会给该会话中的所有进程发送一个SIGHUP(挂断)信号,默认情况下,进程收到该信号后会终止。nohup命令可以使得进程忽略这个SIGHUP信号,从而使用户退出后,进程仍然可以在后台继续运行,使用nohup时,如果没有指定输出重定向,默认会将输出写入到nohup.out文件中。nohup ./long_running_script.sh &,这条命令会在后台运行脚本,并且即使用户退出终端,脚本也会继续执行,其输出会被保存到当前目录下的nohup.out文件中。

在实际应用中,后台运行功能非常广泛,编译大型项目、运行数据备份任务、执行长时间的科学计算等,都可以使用后台运行来避免阻塞终端,也需要注意一些潜在的问题,后台运行的进程会消耗系统资源,如果同时运行过多后台进程,可能会导致系统性能下降,对于需要交互输入的命令,直接放入后台运行可能会导致问题,因为它们无法从终端获取输入,除非明确重定向输入,管理多个后台作业时,需要清楚作业编号和PID,避免误操作。

命令行如何让程序在后台运行?-图3
(图片来源网络,侵删)

命令行后台运行是Linux/Unix系统管理中一项不可或缺的技能,通过合理使用&Ctrl+Zbgfgjobskill以及nohup等命令,用户可以高效地管理长时间运行的进程,提高工作效率,掌握这些技巧,能够让用户更加灵活地利用命令行完成各种复杂的任务。

相关问答FAQs

问题1:为什么我在后台运行一个命令后,终端还是会输出一些信息? 解答:这可能是因为该命令的输出没有被正确重定向,默认情况下,后台进程的标准输出和标准错误仍然会尝试输出到终端,如果你不希望看到这些输出,可以在命令后面加上输出重定向,使用> /dev/null 2>&1将所有输出丢弃,或者> output.log 2>&1将所有输出重定向到某个文件中。./command.sh > /dev/null 2>&1 &

问题2:如何确保我在退出SSH登录后,后台运行的程序不会停止? 解答:要确保退出SSH登录后程序继续运行,主要有两种常用方法,第一种是使用nohup命令,例如nohup ./your_script.sh > output.log 2>&1 &nohup会使得进程忽略SIGHUP信号,并将输出重定向到指定文件,第二种方法是使用screentmux这样的终端复用工具,通过screen -S mysession创建一个新的screen会话,然后在会话中运行你的程序,最后按下Ctrl+A,再按D将会话分离,这样你就可以安全退出SSH,后续可以通过screen -r mysession重新连接到该会话,查看程序的运行状态和输出。

分享:
扫描分享到社交APP
上一篇
下一篇