如何将当前正在运行的Linux进程放入后台?

131
我有一个使用git在Linux shell上将文件上传到远程服务器的命令,需要花费很多小时来完成。
如何将正在运行的程序放在后台?这样我可以继续在shell上工作,而该进程也能完成。

只是猜测,你试过按Ctrl+Z或者像这样运行你的命令吗: #command & - EralpB
该命令已在运行中,所以我没有其他选择。我不确定要尝试哪个命令。我不想打断当前的进程,所以我没有进行实验。 - Mirage
我们应该等待更专业的答案 :) 我的意思是,如果你有机会重新开始。 (命令和事情) - EralpB
这个问题的被接受答案者解释了需要采取的三个步骤:https://dev59.com/SHRB5IYBdhLWcg3wbGxB - Leonard Saers
你也可以打开另一个 PuTTY 实例并再次连接服务器以获取另一个 shell。虽然使用 ctrl+z 的解决方案也很好。 - Ela782
尝试使用以下命令:myapp > /tmp/myapp.log &,这将在后台运行myapp并将其输出写入/tmp/myapp.log - user889030
1个回答

242

使用CTRL+Z键来暂停进程,然后使用命令bg将其恢复到后台。例如:

按下CTRL+Z以暂停当前进程

bg

将进程恢复到后台

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

有关在bash手册页面中的作业控制和bg用法的更多信息:

作业控制
当进程正在运行时,输入挂起字符(通常是^Z, Control-Z)会导致该进程停止并返回控制权给bash。用户可以使用bg命令来在后台继续执行该作业的状态。^Z立即生效,并产生额外的副作用:导致未决输出和预读被丢弃。

bg[jobspec...]
将每个暂停的作业jobspec恢复到后台,就像使用&符号启动一样。如果没有提供jobspec,则使用shell对当前作业的概念。

编辑

启动一个进程,即使您关闭终端它也可以继续运行

nohup [command] [-args] > [filename] 2>&1 &

需要翻译的内容:

e.g.

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

如果您只是想忽略输出(不太明智),请将文件名更改为/dev/null

要将错误消息设置为另一个文件,请将&1更改为该文件的文件名。

此外:您可以使用jobs命令查看这些后台进程的索引列表。您可以通过运行kill%1kill%2来终止后台进程,其中数字是该进程的索引。


我试过了,但是它输出一些东西,然后再次出现在前景中,显示上传了多少数据的百分比。 - Mirage
该进程将按照您在开始时的指示将任何输出写入终端。如果要将输出写入文件或/dev/null,则必须重新启动它。请参见上面的编辑。 - Ed Heal
这意味着,如果进程已经启动,则无法重定向输出。 - Mirage
确实如此。您无法影响进程,只能影响它正在运行的 shell。您可以执行 kill -9 <pid of your shell> 命令,然后进程仍将继续运行并且输出将被丢弃 - 但是您需要重新登录以启动新的 shell。 - Ed Heal
如果您需要注销终端会话,但希望进程继续运行,您也可以使用 disown 命令。 - kirk roerig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接