将nohup工作推向前台


Answers:


7

如果您想启动一个脚本,使其运行而输出不会打扰您的终端,然后在以后启动它以与之交互,您可能想看看终端多路复用器。根据您的系统,我建议tmuxscreen。您可以在下面的链接中找到一些有关如何使用它们的信息:

tmux:

屏幕:

编辑:添加了tmux底漆的链接


+1我不知道的出色工具。非常感谢。
亚当·马坦

19

nohup不会从终端断开命令的连接,它会使脚本忽略SIGHUP,并重定向stdout/stderr到文件nohup.out,以便注销后该命令可以在后台继续运行。

nohup不会自动将其运行的命令置于后台。必须通过在命令行末尾加一个来明确地做到这一点&

$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’

jobs可以打印当前正在运行的作业及其状态。如果该命令jobs找不到它,则它不再是该Shell 的子进程

$ jobs 
[1]+  Running                 nohup ./script.sh &

fg即使使用,也可以使用bash将后台作业恢复到前台nohup。但这不会更改输出重定向,该重定向仍将转到filenohup.out

$ fg
nohup ./script.sh

如果关闭外壳程序/终端或注销,则命令不再是该外壳程序的子级。它属于initprocess。如果您进行搜索,pstree您会发现它现在归进程1(init)所有。由于前台已不存在,因此无法将其带回前台。


If the command jobs cannot find it, then it is no longer a child process of that shell.这是错误的:请尝试按以下顺序查看操作方法:sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$。生成此命令后,您仍会看到sleep使用它生成的相同PID的工作,而jobs不会打印任何内容。子进程不能停止成为子进程的唯一方法是失去其父进程(然后,孤儿成为的子进程init)或分叉+退出(但PID更改,因此它不是原始的子进程)。
罗斯兰

4

我将第二次使用终端多路复用器,但使用tmux而不是screen。出于所有目的和目的,该屏幕均未维护。它的配置是一门黑暗的艺术,可能最早记录在《死灵书》的附录中。尝试编写自己的配置是对Cthulu的一瞥。说真的 看看人们的.screenrc文件。可以肯定的是,有一些方法可以调解屏幕对配置文件的憎恶。Byobu作为致命用户和邪恶代码之间的面纱,表现出色。它带有明智的颜色,菜单界面,以及也许最重要的是状态栏。

但正如我所说,我建议改用tmux。它仍然需要一些小的配置,但是有据可查,并且您的配置文件不会看起来很乱。同样,您从颜色和状态栏开始。比较我的screenrc和tmux.conf文件:


0

如果您只想看活帽子,那么输出可能适合您:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out

0

可以将任何Linux命令发送到后台,&最后添加“ ”。

要查看所有后台作业,您可以发出 jobs

jobs
[1]  + suspended  nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2]    running    nohup sh kafka-server-start.sh ../config/server.properties
[3]  - running    nohup sudo mongod --dbpath=/var/lib/mongodb

在这里,我在后台运行3个工作:zookeeper,kafka和mongo daemon。[1],[2]和[3]是这些任务的相应工作编号。

您可以使用以下命令将这些任务置于前台 fg %$taskNumber.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.