5

如何在后台运行Linux命令

 1 year ago
source link: https://www.myfreax.com/how-to-run-linux-commands-in-background/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何在后台运行Linux命令

通常当您在终端中运行命令时,必须等到命令完成后才能运行另一个命令

Updated At 16 Dec 2022 6 min read
By myfreax
如何在后台运行Linux命令

如何在后台运行Linux命令

通常,当您在终端中运行命令时,必须等到命令完成后才能运行另一个命令。这称为在前台或前台进程运行命令。

当某个进程在前台运行时,它将占用您当前的Shell会话,并且您可以使用输入设备与之进行交互。

如果命令需要很长时间才能完成,而同时又要运行其他命令怎么办?您有几种选择可以使用。

最明显和直接的选择是启动另一个Shell会话并在其中运行命令。另一种选择是在后台运行命令。后台进程是在终端启动并在后台运行而无需用户交互的进程。

在本教程中,我们将说明Linux 后台进程。我们将向您展示如何在后台启动命令以及如何在Shell会话关闭时后保持进程的运行。

后台运行Linux命令

要在后台运行命令,请在命令末尾添加&符号,终端的标准输出包括用括号括起来的Shell作业ID和进程ID。例如命令sleep 30 &

您可以同时在后台运行多个进程。后台进程会继续向您启动进程的终端写入消息,这称为进程标准输出stdout或者标准错误stderr

要忽略进程的标准输出标准输入,请运行命令sleep 30 & > /dev/null 2>&1程的标准输出和标准输入重定向空设备文件。

如果你想知道sleep 30 > /dev/null 2>&1 &命令的详细解释,请参考我们的教程标准输入/标准输出/标准错误与重定向

sleep 30 & #[1] 25177
sleep 30 & > /dev/null 2>&1 & 
stdout-stdin-and-redirection.webp

查看后台进程运行状态

要查看后台进程的运行状态,可以使用jobs命令打印当前Shell会话启动的所有进程。输出包括作业ID,进程ID,进程状态以及启动进程的命令。

要将后台进程置于前台运行,请使用fg命令。如果您有多个后台作业,请在fg命令后指定作业ID并使用%作为前缀。

要终止后台进程,请使用kill命令,后跟进程ID终止进程。

jobs -l
fg %1
kill -9 25177
[1]+ 25177 Running                 ping google.com &

移动前台进程进入后台

要移动正在运行的前台进程进入后台运行,请先按快捷键Ctrl+Z停止进程正在运行的进程。然后运行bg命令将停止的进程移至后台运行。

例如运行sleep命令sleep 300启动前台进程,然后按下Ctrl+Z停止sleep命令进程。再运行bg命令。

最后运行命令jobs -l查看后台进程的运行状态,确定进程是否进入后台运行,可以通过查看启动命令来确认最近移至后台的进程。

sleep 300
# Ctrl+Z
bg
jobs -l
[5]+  Stopped                 sleep 300
Ctrl+Z
[5]+ sleep 300 &
bg
[1]- 307066 Stopped (signal)        sleep 3600
[2]+ 308313 Stopped (signal)        sleep 3600
[3]  311013 Running                 sleep 3600 &
[4]  340083 Running                 sleep 300 &
jobs -l

退出终端保持后台进程运行

如果SSH连接断开或退出当前Shell会话,后台进程将会终止。在交互式Shell会话结束后,有几种方法可以让后台进程保持运行。

一种方法是使用Shell内置的disown命令从当前Shell会话移除对作业任务的控制。如果您有多个后台作业,请在disown命令后添加%和作业ID指定要移除的作业任务。

要确认从作业表中删除作业任务。请运行命令jobs -l命令要列出所有正在运行的作业任务。

如果你在此时退出当前Shell终端,然后创建另一个终端Shell会话运行命令ps aux | grep "sleep 300" | grep -v grep。你将会看到sleep 300命令的进程还在运行。

sleep 300 &
jobs -l
disown
disown %1
jobs -l
ps aux | grep "sleep 300" | grep -v grep

nohup 后台运行命令

在交互式Shell会话结束后,让后台进程保持运行的另一种方法是使用nohup命令

nohup命令用于运行程序或者命令,并忽略所有中断信号SIGHUPSIGHUP是当前控制终端关闭时发送到进程的信号。

nohup命令的语法形式是nohup COMMAND [ARGS]nohup命令仅接受两个选项--help--version,除此之外没有任何其它没有任何选项。

nohup sleep 300 &命令将会在后台运行命令sleep 300sleep 300命令进程的标准输出重定向到nohup.out文件。

nohup.out文件创建在当前工作目录中。如果运行nohup命令的用户没有当前工作目录的读写权限,nohup.out文件写到用户的家目录。

此时如果您注销或关闭终端,sleep 300命令进程不会终止。

nohup sleep 300 &
nohup: ignoring input and appending output to 'nohup.out'

要在后台运行命令,请在命令末尾添加符号&。当您在后台运行命令时,不必等到命令完成就可以运行另一命令。如果您有任何问题或反馈,请随时发表评论。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK