Linux后台执行命令:&和nohup

作者: 云中布衣   分类:  学习笔记    热度: (742℃)   时间: 2017-7-30 16:50   标签: #Linux命令    

作为一个坚果云的忠实用户,最吸引我的是它强大的跨平台同步功能。它支持windows、mac os、linux。其中linux的支持是我选择它的主要原因。但在长期使用的过程中一直有一个问题困扰着我:Ubuntu下坚果云客户端如果因为网络的原因开机启动没有成功,后续通过点击程序图标是打开不了程序的。以前遇到这种情况我一般是通过重启系统来解决(简直狗血!)今天好好的研究了下它的自启动命令,终于把这个问题解决了。

选区_126.png

通过前面那篇博文的步骤我们可以找到gnome-session中的自启动项,然后找到坚果云客户端的自启动命令如下:

sh -c "(sleep 30 && nohup ~/.nutstore/dist/bin/nutstore-pydaemon.py >/dev/null 2>&1) &"

这里我们重点关注

(sleep 30 && nohup ~/.nutstore/dist/bin/nutstore-pydaemon.py >/dev/null 2>&1) &

接下来我们全面解析下这条自启动命令。

1.观察上述命令,我们可以知道坚果云的启动脚本为:

~/.nutstore/dist/bin/nutstore-pydaemon.py

2.sleep 30shell脚本中延迟执行的命令,这里表示延迟30s执行脚本。这么做主要是因为坚果云客户端进程需要使用到网络,而网络的初始化需要时间,因此延迟30s执行可以保证启动坚果云客户端守护进程时网络环境的正常

3.&&则表示command1 && command2中左边command1命令成功执行时,右边command2命令才会执行

4.剩下的nohup test > /dev/null 2>&1 &是本文讨论的重点

当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事要做,比如阅读电子邮件。对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时间段运行(例如凌晨)。为了使这些进程能够在后台执行,也就是说不在终端屏幕上运行,有几种选择方法可供使用。

一、

当前台运行某个作业时,终端被该作业占据。可以在命令后面加上&实现后台运行。例如sh test.sh &。适合在后台运行的命令有find、费时的排序以及一些shell脚本。在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为那样的你的机器就会一直处于等待用户输入的状态。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它输出重定向到某个文件中。例如:

sh test.sh > out.file 2>&1 &

上面的命令表示将所有的标准输出和错误输出都重定向到一个叫做out.file的文件中。

友情提示:操作系统中有三个常用的流

0:标准输入流stdin

1:标准输出流stdout

2:标准错误流stderr

>out.file表示1>out.file实际上是将标准输出流重定向输出到文件out.file中,而2>&1是把标准错误2重定向输出到标准输出1中,而标准输出由重定向到文件out.file中,所以结果是所有标准输出和标准错误都输出到文件out.file中了。至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而标准输出有缓冲区。如果1>out.file 2>out.file文件out.file被打开两次,而stdout和stderr将会竞争覆盖,这肯定不是我们想要的结果。

那么回到最开始坚果云的自启动命令,其中/dev/null文件就相当于out.file

但是这个/dev/null相当于一个无底洞,任何东西都可以重定向到这里,但是却无法打开。所以一般很大的stdout和stderr当你不关心的时候都可以利用stdout和stderr重定向到这里。

二、nohup

使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出账户),作业就会停止运行,这是因为当前的登录会话结束时,控制终端设备将和登录进程脱离,那么系统就向所有与这个终端相联系的进程发送SIGHUP的信号,通知进程线路已经刮起了,如果程序没有接管这个信号的处理,那么缺省的反应就是进程结束,这也正是为什么普通程序并不能真正脱离登录会话而运行进程,为了使得在系统登出后还可以正常执行程序,只有使用命令nohup来启动响应的程序。nohup命令可以在你退出账户之后继续运行响应的进程。nohup就是不挂起的意思(no hang up)。该命令的一般形式如下:

nohup comand &

如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup,out的文件中,除非另外指定输出文件。

nohup command >out.file 2>&1 &

最后提醒一下,使用nohup之后,很多人就这样不管了,其实这样也有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用nohup后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。

友情提示:

ctrl + z:可以将一个正在前台执行的命令放到后台,并且处于暂停状态

ctrl + c:终止前台命令

jobs:查看当前在后台运行进程的命令

(完)

56.8K

评论:

云中布衣 Say:
@劳保用品 客气了,欢迎常来坐坐。

2017-09-13 00:53


劳保用品 Say:
谢谢分享

2017-09-12 16:04


发表评论:

© 云中布衣 2015 | Driven by EMLOG  | SiteMap | RunTime: 11.73ms RSS  | MORE  |   | TOP

文章数量【258】 评论数量【238】 稳定运行【1208天】

Visitor IP Address【54.196.190.32】

Email:ieeflsyu#outlook.com