标签 后台 下的文章

在本指南中,我们将会阐明一个在 Linux 系统中进程管理的简单但是重要的概念,那就是如何从它的控制终端完全脱离一个进程。

当一个进程与终端关联在一起时,可能会出现两种问题:

  1. 你的控制终端充满了很多输出数据或者错误及诊断信息
  2. 如果发生终端关闭的情况,进程连同它的子进程都将会终止

为了解决上面两个问题,你需要从一个控制终端完全脱离一个进程。在我们实际上解决这个问题之前,让我们先简要的介绍一下,如何在后台运行一个进程。

如何在后台开始一个 Linux 进程或者命令行

如果一个进程已经运行,例如下面的 tar 命令行的例子,简单的按下 Ctrl+Z 就可以停止它(LCTT 译注:这里说的“停止”,不是终止,而是“暂停”的意思),然后输入命令 bg 就可以继续以一个任务在后台运行了。

你可以通过输入 jobs 查看所有的后台任务。但是,标准输入(STDIN)、标准输出(STDOUT)和标准错误(STDERR)依旧掺杂到控制台中。

$ tar -czf home.tar.gz .
$ bg
$ jobs

 title=

在后台运行 Linux 命令

你也可以直接使用符号 & 在后台运行一个进程:

$ tar -czf home.tar.gz . &
$ jobs

 title=

在后台开始一个 Linux 进程

看一下下面的这个例子,虽然 tar 命令是作为一个后台任务开始的,但是错误信息依旧发送到终端,这表示,进程依旧和控制终端关联在一起。

$ tar -czf home.tar.gz . &
$ jobs

 title=

运行在后台的 Linux 进程信息

退出控制台之后,保持 Linux 进程的运行

我们将使用 disown 命令,它在一个进程已经运行并且被放在后台之后使用,它的作用是从 shell 的活动任务列表中移走一个 shell 任务,因此,对于该任务,你将再也不能使用 fgbg 命令了。

而且,当你关闭控制控制终端,这个任务将不会挂起(暂停)或者向任何一个子任务发送 SIGHUP 信号。

让我们看一下先下面的这个使用 bash 中内置命令 disown 的例子。

$ sudo rsync Templates/* /var/www/html/files/ &
$ jobs
$ disown  -h  %1
$ jobs

 title=

关闭终端之后,保持 Linux 进程运行

你也可以使用 nohup 命令,这个命令也可以在用户退出 shell 之后保证进程在后台继续运行。

$ nohup tar -czf iso.tar.gz Templates/* &
$ jobs

 title=

关闭 shell 之后把 Linux 进程置于后台

从控制终端脱离一个 Linux 进程

因此,为了彻底从控制终端脱离一个程序,对于图形用户界面 (GUI) 的程序例如 firefox 来说,使用下面的命令行格式会更有效:

$ firefox </dev/null &>/dev/null &

在 Linux 上,/dev/null 是一个特殊的文件设备,它会忽略所有的写在它上面的数据,上述命令,输入来源和输出发送目标都是 /dev/null。

作为结束陈述,运行一个连接到控制终端的进程,作为用户你将会在你的终端上看到这个进程数据的许多行的输出,也包含错误信息。同样,当你关闭一个控制终端,你的进程和子进程都将会终止。

重要的是,对于这个主题任何的问题或者观点,通过下面的评论联系我们。


via: http://www.tecmint.com/run-linux-command-process-in-background-detach-process/

作者:Aaron Kili 译者:yangmingming 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux Terminal Window.

Linux终端窗口

这是一个简短但是非常有用的教程:它向你展示从终端运行Linux应用程序的同时,如何保证终端仍然可以操作。

在Linux中有许多方式可以打开一个终端,这主要取决于你的发行版的选择和桌面环境。

使用Ubuntu的话,你可以使用CTRL + ALT + T组合键打开一个终端。你也可以点击超级键(Windows键)打开一个终端窗口。在键盘上,打开Ubuntu Dash,然后搜索"TERM"。点击"Term"图标将会打开一个终端窗口。

其他诸如XFCE, KDE, LXDE, Cinnamon和MATE的桌面环境,你将会在菜单中发现“终端”这个应用。还有一些发行版会把终端图标放在菜单项,或者在面板上放置终端启动器。

你可以在终端里面输入一个程序的名字来启动一个应用。举例,你可以通过输入"firefox"启动火狐浏览器。

从终端运行程序的好处是可以使用额外的选项。

举个例子,如果你输入下面的命令,一个新的火狐浏览器将会打开,而且默认的搜索引擎将会搜索引号之间的词语:

firefox -search "Linux.About.Com"

你会发现,如果你运行火狐浏览器,应用程序打开后,控制权将会回到终端(重新出现了命令提示符),这将意味着你可以继续在终端工作。

通常情况下,如果你通过终端运行一个程序,程序打开后,并且直到那个程序关闭结束,你都将不会获得终端的控制权。这是因为你是在前台打开程序的。

想要从终端运行一个程序,并且立即将终端的控制权返回给你,你需要以后台进程的方式打开程序。

为了以后台进程的方式打开一个程序,只需要添加符号(&)到命令中,如下面所示:

libreoffice &

在终端中仅仅提供程序的名字,应用程序可能运行不了。如果程序不存在于一个设置在PATH 环境变量的文件夹中,你需要指定完整的路径名来运行程序。

/path/to/yourprogram &

如果你并不确定一个程序是否存在于Linux文件系统中,使用find或者locate命令来查找该应用程序。

找一个文件的语法如下:

find /path/to/start/from -name programname

举个例子,可以使用下面的命令寻找Firefox的位置:

find / -name firefox

输出会很快滚动出很多,所以你可以以管道的方式控制输出的多少:

find / -name firefox | more
find / -name firefox | less

find命令将会返回因权限拒绝而发生错误的文件夹数量,这些文件夹你没有权限去搜索。

你可以使用sudo命令提升你的权限。如果sudo没有安装,你需要切换到拥有权限的用户:

sudo find / -name firefox | more

如果你知道你想寻找的文件在你的当前文件夹中,你可以一个点代替先前的斜线,如下:

sudo find . -name firefox | more

你可能不需要sudo来提升权限。如果你在home文件夹中寻找文件,sudo就不需要。

一些应用程序需要提升用户权限来运行,你可能得到一个缺少权限的错误,除非你使用一个具有足够权限的用户,或者使用sudo提升你的权限。

下面是一个小花招。如果你运行一个程序,而且它需要提升权限来运行,输入下面命令来提升权限重新执行:

sudo !!

via: http://linux.about.com/od/commands/fl/How-To-Run-Linux-Programs-From-The-Terminal-In-Background-Mode.htm

作者:Gary Newell 译者:su-kaiyao 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux 终端不仅是一个键入命令的地方。如若你能熟谙这些基础技巧,那么你会在绝大多数 Linux 发行版的默认使用的 Bash shell中游刃有余。

这是howtogeek.com 网站特供给初级用户升级打怪时不能忘记携带的七种武器——

1.Tab 补全

这样能节省时间,并且对于输入那些你不很确定其具体名称的文件和命令来说很方便。比如,当前目录下有一个名为“really long file name”的文件,你想要删除它。你可以输入完整的文件名,但是你必须确保正确地输入了空格和每个字母。若当前目录下还有许多以字母“r”开头的文件,(如果你没有正确地输入字符) Bash 将不知道你想要删除哪一个文件。

如果在当前目录下存在着另一个名为“really very long file name”的文件,你敲击了Tab键。Bash 将为所有以“r”开头的文件自动补充“really\ ”部分。此时继续敲击Tab键,你将得到匹配所有文件名的列表。

2.管道机制

这种机制允许你把一条命令的输出传送到另一条命令。按照 UNIX 哲学,每个程序都足够小,只做一件事并将之做到最好。例如,ls命令列出当前目录下的所有文件,grep命令搜索输入其中的指定检索项。

你可以通过管道机制(|字符)把二者结合起来,在当前目录下搜索文件。以下给出的命令(在当前文件夹下)搜索关键字为“word”的文件:

ls | grep word

3.通配符

“*”(星号)字符是一种匹配任意长度字符的通配符。比如,你想删除当前文件夹下名为“really long file name”和“really very long file name”的两个文件,你可以运行以下命令:

rm really*name

这条命令会删除所有以“really”开头以“name”结尾的文件。但是,如果你运行的是 rm * 这条命令,你将会删除文件夹下的所有文件。(译注:使用通配符时要小心,尤其是你的rm没有-f确认时!)

4.输出重定向

“>”字符可以把一条命令的输出重定向到一个文件或另一条命令。比如,下面这行命令执行完 ls 后会列出当前文件夹下的所有文件,其结果不是在终端显示,而是输出到当前文件夹下一个名为“file1”的文件中去:

ls > file1

5.历史记录

Bash 能记住你以前输入过的命令,上、下方向键可以逐行调出它们。使用 history 命令打印历史记录,以管道机制 grep 选择性地输出你想要的结果。

~
. 
..

“~”,也叫做波浪符,用来表示当前用户的主目录。相比通过 cd /home/name 到达你的主目录,你可以输入 cd ~ 来达到相同效果。这点也可以在相关路径上使用:比如 cd ~/Desktop 能够到达当前用户的 Desktop 目录。

同样,“.”代表当前目录,“..”代表当前目录的父目录。使用 cd .. 可以返回上一级目录。它们也可以用在相关路径上,举例说明:你当前处在 Desktop 文件夹下,通过 cd ../Documents 命令,你可以转到与 Desktop 共有同一父文件夹的 Documents 文件夹去。

(译注:“-”代表前一个目录,cd - 可以返回到前一个工作目录。)

6.后台命令

Bash 默认情况下会在当前终端下执行你键入的每条命令。通常这样是没有问题的,但是如果你想要在启动某个应用后继续使用终端呢?通过输入 firefox 启动火狐浏览器,你的终端将被错误提示等各种信息输出占据,直到你关闭火狐浏览器为止。在 Bash 中你可以通过在命令结尾添加“&”操作符来后台执行程序。

firefox &

7.条件执行

Bash 也可以连续执行两条命令。 第二条命令仅在第一条命令成功执行后才会开始执行。如要如此,你可以通过键入“&&”,也就是两个“&”字符进行分隔,在同一行输入两条命令。下面给出的命令会在等待 5 秒后运行 gnome-screenshot 工具:

sleep 5 && gnome-screenshot 

via: http://www.efytimes.com/e1/fullnews.asp?edid=123564

译者:SteveArcher 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出