乐观 发表于 2015-1-16 14:29:53

linux教程之让历程在背景牢靠运转的几种办法

学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
想让历程在断开毗连后仍然坚持运转?假如该历程已入手下手运转了该怎样弥补?假如有大批这类需求怎样简化操纵?
我们常常会碰着如许的成绩,用telnet/ssh登录了远程的Linux服务器,运转了一些耗时较长的义务,了局却因为收集的不不乱招致义务半途失利。怎样让命令提交后不受当地封闭终端窗口/收集断开毗连的搅扰呢?上面举了一些例子,您能够针对分歧的场景选择分歧的体例来处置这个成绩。
nohup/setsid/&
场景:
假如只是一时有一个命令必要长工夫运转,甚么办法能最烦琐的包管它在背景不乱运转呢?
办理办法:
我们晓得,当用户刊出(logout)大概收集断开时,终端会收到HUP(hangup)旌旗灯号从而封闭其一切子历程。因而,我们的办理举措就有两种路子:要末让历程疏忽HUP旌旗灯号,要末让历程运转在新的会话里从而成为不属于此终真个子历程。
1.nohup
nohup无疑是我们起首想到的举措。望文生义,nohup的用处就是让提交的命令疏忽hangup(在Unix的初期版本中,每一个终端城市经由过程modem和体系通信。当用户logout时,modem就会挂断(hangup)德律风。同理,当modem断开毗连时,就会给终端发送hangup旌旗灯号来关照其封闭一切子历程。)旌旗灯号。让我们先来看一下nohup的匡助信息
NOHUP(1)UserCommandsNOHUP(1)
NAME
nohup-runacommandimmunetohangups,withoutputtoanon-tty
SYNOPSIS
nohupCOMMAND...
nohupOPTION
DESCRIPTION
RunCOMMAND,ignoringhangupsignals.
--helpdisplaythishelpandexit
--version
outputversioninformationandexit

可见,nohup的利用是非常便利的,只需在要处置的命令前加上nohup便可,尺度输入和尺度毛病缺省会被重定向到nohup.out文件中。一样平常我们可在开头加上"&"来将命令同时放进背景运转,也可用">filename2>&1"来变动缺省的重定向文件名。
nohup示例
#nohuppingwww.ckuyun.com&
3059
nohup:appendingoutputto`nohup.out
#ps-ef|grep3059
root3059984021:06pts/300:00:00pingwww.ckuyun.com
root3067984021:06pts/300:00:00grep3059
#

2。setsid
nohup无疑能经由过程疏忽HUP旌旗灯号来使我们的历程制止半途被中止,但假如我们换个角度思索,假如我们的历程不属于承受HUP旌旗灯号的终真个子历程,那末天然也就不会遭到HUP旌旗灯号的影响了。setsid就可以匡助我们做到这一点。让我们先来看一下setsid的匡助信息:

SETSID(8)LinuxProgrammer’sManualSETSID(8)NAMEsetsid-runaprograminanewsessionSYNOPSISsetsidprogramDESCRIPTIONsetsidrunsaprograminanewsession.

可见setsid的利用也长短常便利的,也只需在要处置的命令前加上setsid便可。
setsid示例
#setsidpingwww.ckuyun.com
#ps-ef|grepwww.ckuyun.com
root310941007:28?00:00:00pingwww.ckuyun.com
root3110229217007:29pts/400:00:00grepwww.ckuyun.com
#

值得注重的是,上例中我们的历程ID(PID)为31094,而它的父ID(PPID)为1(即为init历程ID),并非以后终真个历程ID。请将此例与nohup例中的父ID做对照。
3。&
这里另有一个关于subshell的小技能。我们晓得,将一个或多个定名包括在“()”中就可以让这些命令在子shell中运转中,从而扩大出良多风趣的功效,我们如今要会商的就是个中之一。
当我们将"&"也放进“()”内以后,我们就会发明所提交的功课其实不在功课列表中,也就是说,是没法经由过程jobs来检察的。让我们来看看为何如许就可以躲过HUP旌旗灯号的影响吧。
subshell示例
#(pingwww.ckuyun.com&)
#ps-ef|grepwww.ckuyun.com
root162701014:13pts/400:00:00pingwww.ckuyun.com
root1627815362014:13pts/400:00:00grepwww.ckuyun.com
#

从上例中能够看出,新提交的历程的父ID(PPID)为1(init历程的PID),并非以后终真个历程ID。因而其实不属于以后终真个子历程,从而也就不会遭到以后终真个HUP旌旗灯号的影响了
screen
场景:
我们已晓得了怎样让历程免受HUP旌旗灯号的影响,可是假如有大批这类命令必要在不乱的背景里运转,怎样制止对每条命令都做如许的操纵呢?
办理办法:
此时最便利的办法就是screen了。复杂的说,screen供应了ANSI/VT100的终端摹拟器,使它可以在一个实在终端下运转多个全屏的伪终端。screen的参数良多,具有很壮大的功效,我们在此仅先容其经常使用功效和扼要剖析一下为何利用screen可以制止HUP旌旗灯号的影响。我们先看一下screen的匡助信息:
SCREEN(1)SCREEN(1)
NAME
screen-screenmanagerwithVT100/ANSIterminalemulation
SYNOPSIS
screen[-options]]
screen-r[tty[.host]]
screen-rsessionowner/[tty[.host]]
DESCRIPTION
Screenisafull-screenwindowmanagerthatmultiplexesaphysical
terminalbetweenseveralprocesses(typicallyinteractiveshells).
EachvirtualterminalprovidesthefunctionsofaDECVT100terminal
and,inaddition,severalcontrolfunctionsfromtheISO6429(ECMA
48,ANSIX3.64)andISO2022standards(e.g.insert/deletelineand
supportformultiplecharactersets).Thereisascrollbackhistory
bufferforeachvirtualterminalandacopy-and-pastemechanismthat
allowsmovingtextregionsbetweenwindows.

利用screen很便利,有以下几个经常使用选项:
用screen-dmSsessionname来创建一个处于断开形式下的会话(并指定其会话名)。
用screen-list来列出一切会话。
用screen-rsessionname来从头毗连指定会话。
用快速键CTRL-ad来临时断开以后会话。
screen示例
#screen-dmSUrumchi
#screen-list
Thereisascreenon:
12842.Urumchi(Detached)
1Socketin/tmp/screens/S-root.
#screen-rUrumchi

当我们用“-r”毗连到screen会话后,我们就能够在这个伪终端内里随心所欲,不再用忧虑HUP旌旗灯号会对我们的历程形成影响,也不必给每一个命令前都加上“nohup”大概“setsid”了。这是为何呢?让我来看一下上面两个例子吧。
1.未利用screen时新历程的历程树
#pingwww.google.com&
9499
#pstree-H9499
init─┬─Xvnc
├─acpid
├─atd
├─2*
├─sshd─┬─sshd───bash───pstree
│└─sshd───bash───ping


我们能够看出,未利用screen时我们所处的bash是sshd的子历程,当ssh断开毗连时,HUP旌旗灯号天然会影响到它上面的一切子历程(包含我们新创建的ping历程)。
2.利用了screen后新历程的历程树
#screen-rUrumchi
#pingwww.ckuyun.com&
9488
#pstree-H9488
init─┬─Xvnc
├─acpid
├─atd
├─screen───bash───ping
├─2*

而利用了screen后就分歧了,此时bash是screen的子历程,而screen是init(PID为1)的子历程。那末当ssh断开毗连时,HUP旌旗灯号天然不会影响到screen上面的子历程了。
总结
如今几种办法已先容终了,我们能够依据分歧的场景来选择分歧的计划。nohup/setsid无疑是一时必要时最便利的办法,disown能匡助我们来过后弥补以后已在运转了的功课,而screen则是在多量量操纵时不贰的选择了

</p>
使用gcc或g++进行编译,使用gdb进行调试;

仓酷云 发表于 2015-1-17 05:54:10

尽量不要提问纯属是扯蛋.学习Linux特别是自己一个人初学入手的时候没人教很困难.当然如果可以的话平时多去买些Linux书...对学习Linux很有帮助.

透明 发表于 2015-1-20 14:37:51

主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。

再现理想 发表于 2015-1-29 09:16:12

如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。可能你会遇到这种情况,对于一个问题会出现不同内容回答,这时你需要通过实践来验证。

简单生活 发表于 2015-2-6 00:15:13

任何一个叫做操作系统的东西都是这样子构成的:内核+用户界面+一般应用程序。

不帅 发表于 2015-2-14 13:34:44

虽然大家都比较喜欢漂亮的mm,但是在学 linux 的过程中,还是要多和“男人”接触一下:P 遇到问题的时候,出来看说和上网查之外,就是要多用 linux 下的 man 命令找找帮助。

谁可相欹 发表于 2015-3-4 06:47:01

了解Linux的网络安全,系统的安全,用户的安全等。安全对于每位用户,管理员来说是非常重要的。

冷月葬花魂 发表于 2015-3-11 17:51:29

主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。

兰色精灵 发表于 2015-3-19 04:50:59

期间我阅读了不少关于Linux的相关资料,其中也不乏一些有趣的小故事,这既丰富了我的课余生活,也让我加深了对一些术语的理解,比玩游戏强多了。?

若相依 发表于 2015-3-27 08:09:32

熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件。

只想知道 发表于 2015-3-27 08:09:32

掌握硬件配置,如显卡,声卡,网卡等,硬件只要不是太老或太新一般都能被支持,作为一名Linux系统管理员建议多阅读有关硬件配置文章,对各种不支持或支持不太好的硬件有深刻的了解。

若相依 发表于 2015-3-27 08:09:33

硬盘安装及光盘安装,清楚了解安装Linux应注意的有关问题,如安装Linux应在最后一个分区内,至少分二个分区。
页: [1]
查看完整版本: linux教程之让历程在背景牢靠运转的几种办法