linux环境下如何让进程在后台运行 -欧洲杯足彩官网

0顶
0踩

linux环境下如何让进程在后台运行

2017-03-16 16:09 by 副主编 jihong10102006 评论(0) 有6635人浏览

一. nohup / setsid / &
使用场景:如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?

我们的解决办法就有两种途径:要么让进程忽略 hup 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

解决方法:
1.nohup
只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用>filename 2>&1来更改缺省的重定向文件名。
    [root@pvcent107 ~]# nohup ping www.ibm.com & 
    [1] 3059 
    nohup: appending output to `nohup.out' 
    [root@pvcent107 ~]# ps -ef |grep 3059 
    root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com 
    root      3067   984  0 21:06 pts/3    00:00:00 grep 3059 
    [root@pvcent107 ~]# 

2. setsid
setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。
    [root@pvcent107 ~]# setsid ping www.ibm.com 
    [root@pvcent107 ~]# ps -ef |grep www.ibm.com 
    root     31094     1  0 07:28 ?        00:00:00 ping www.ibm.com 
    root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com 
    [root@pvcent107 ~]# 

上例中我们的进程 id(pid)为31094,而它的父 id(ppid)为1(即为 init 进程 id),并不是当前终端的进程 id。请将此例与nohup 例中的父 id 做比较。

3. &
将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中 当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。
    [root@pvcent107 ~]# (ping www.ibm.com &) 
    [root@pvcent107 ~]# ps -ef |grep www.ibm.com 
    root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com 
    root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com 
    [root@pvcent107 ~]# 

新提交的进程的父 id(ppid)为1(init 进程的 pid),并不是当前终端的进程 id。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 hup 信号的影响了。

二. disown
使用场景:如果事先在命令前加上 nohup 或者 setsid 就可以避免 hup 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 hup 信号的影响呢?

解决方法:这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了
  • 用disown -h jobspec来使某个作业忽略hup信号。
  • 用disown -ah 来使所有的作业都忽略hup信号。
  • 用disown -rh 来使正在运行的作业忽略hup信号。
当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。

disown 示例1(如果提交命令时已经用“&”将命令放入后台运行,则可以直接使用“disown”)
    [root@pvcent107 build]# cp -r testlargefile largefile & 
    [1] 4825 
    [root@pvcent107 build]# jobs 
    [1]   running                 cp -i -r testlargefile largefile & 
    [root@pvcent107 build]# disown -h %1 
    [root@pvcent107 build]# ps -ef |grep largefile 
    root      4825   968  1 09:46 pts/4    00:00:00 cp -i -r testlargefile largefile 
    root      4853   968  0 09:46 pts/4    00:00:00 grep largefile 
    [root@pvcent107 build]# logout 

disown 示例2(如果提交命令时未使用“&”将命令放入后台运行,可使用 ctrl-z 和“bg”将其放入后台,再使用“disown”)
    [root@pvcent107 build]# cp -r testlargefile largefile2 
     
    [1]   stopped                 cp -i -r testlargefile largefile2 
    [root@pvcent107 build]# bg %1 
    [1]  cp -i -r testlargefile largefile2 & 
    [root@pvcent107 build]# jobs 
    [1]   running                 cp -i -r testlargefile largefile2 & 
    [root@pvcent107 build]# disown -h %1 
    [root@pvcent107 build]# ps -ef |grep largefile2 
    root      5790  5577  1 10:04 pts/3    00:00:00 cp -i -r testlargefile largefile2 
    root      5824  5577  0 10:05 pts/3    00:00:00 grep largefile2 
    [root@pvcent107 build]# 

三: screen
使用场景: 我们已经知道了如何让进程免受 hup 信号的影响,但是如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呢?

欧洲杯足彩官网的解决方案: 此时最方便的方法就是 screen 了。简单的说,screen 提供了 ansi/vt100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen 的参数很多,具有很强大的功能,
  • 用screen -dms (sessionname)来建立一个处于断开模式下的会话(并指定其会话名)。
  • 用screen -list 来列出所有会话。
  • 用screen -r (sessionname)来重新连接指定会话。
  • 用快捷键ctrl-a d 来暂时断开当前会话。
screen实例
    [root@pvcent107 ~]# screen -dms urumchi 
    [root@pvcent107 ~]# screen -list 
    there is a screen on: 
            12842.urumchi   (detached) 
    1 socket in /tmp/screens/s-root. 
     
    [root@pvcent107 ~]# screen -r urumchi 

当我们用“-r”连接到 screen 会话后,我们就可以在这个伪终端里面为所欲为,再也不用担心 hup 信号会对我们的进程造成影响,也不用给每个命令前都加上“nohup”或者“setsid”了。

1.未使用 screen 时新进程的进程树
    [root@pvcent107 ~]# ping www.google.com & 
    [1] 9499 
    [root@pvcent107 ~]# pstree -h 9499 
    init─┬─xvnc 
         ├─acpid 
         ├─atd 
         ├─2*[sendmail]     
         ├─sshd─┬─sshd───bash───pstree 
         │       └─sshd───bash───ping 

未使用 screen 时我们所处的 bash 是 sshd 的子进程,当 ssh 断开连接时,hup 信号自然会影响到它下面的所有子进程(包括我们新建立的 ping 进程)。

2.使用了 screen 后新进程的进程树
    [root@pvcent107 ~]# screen -r urumchi 
    [root@pvcent107 ~]# ping www.ibm.com & 
    [1] 9488 
    [root@pvcent107 ~]# pstree -h 9488 
    init─┬─xvnc 
         ├─acpid 
         ├─atd 
         ├─screen───bash───ping 
         ├─2*[sendmail] 

而使用了 screen 后就不同了,此时 bash 是 screen 的子进程,而 screen 是 init(pid为1)的子进程。那么当 ssh 断开连接时,hup 信号自然不会影响到 screen 下面的子进程了。
  • 大小: 155.3 kb
来自:
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 替换原api函数入口实现挂钩,pe文件,动态链接实现通用替换类,实现代码攻击。另外有文档介绍了其工作原理,再次声明本代码核心类部分非原创。

  • 这个问题来自伴水的《划拳机器人》,对本文用途感兴趣的朋友请大致阅读伴水的帖子,在帖子中我用这个方法写了剪刀五号,战绩不错,当然属于作弊的方法了。剪刀五号的思路就是每次出拳,尽量让对方能赢,然后根据一个地址段来扫描内存中对方所赢的局数的保存地址,找到后在得到比赛结果时把内存数据改掉。这个类似以前打单机游戏时用的fpe之类的修改工具。当然,如果对方故意犯规,一局也不赢,你是找不到他的地址的

  • 最近一直忙于opencv图像处理方面的学习,以及工作,没有更新c/c 专栏方面的博客了,所以今天就给大家写个应用层方面的编程代码,可用于参考学习,本篇博客将运用windowssdk库所提供的api来编写一个修改其他进程里变量值的程序。在开始实际编写代码之前,先给大家介绍一下所需函数:openprocess、virtualprotectex、readprocessmemory、writeproce...

  • 原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是因为看了原文,我才学会了hook,鉴于原文的排版不是很好, 又没有原工程例子源码下载,因此我决定对其重新整理,文章后面附有我测试时的工程源码下载地址。 注:我测试的环境为win7 vs2008 mfc -------------------------

  • jmp与call hook之间的较量,攻防之战

  • api劫持,windows-api劫持(api-hook)

  • 封装capihook类:(某本书的笔记)   1)hook所有模块 hook一个进程对某个api的调用时,不仅要修改主模块的导入表,还必须遍历此进程的所有模块,替换掉每个对目标api的调用: void capihook::replaceiatentryinonemod(lpstr pszexportmod, proc pfncurrent,

  • 有时候要研究游戏封包或者需要对其进行修改,则最好的方法是hook他的网络api函数,如用于发送封包的send函数和 用于接受的recv,wsarecv函数等等。 将hook代码写到dll中,然后通过修改游戏运行程序的输入表去加载这个dll从而达到劫持api的作用! 修改pe文件的输入表方法:最简单的就是试用pe工具lordpe了,打开程序,选择目录,点击输入表,然后右键增加输入表

  • 所谓的api hook,就是利用某种技术将api的调用转为我们自己定义的函数的调用。这种技术在实际项目里面的应用也是很广泛的。最近,我在做关于凯发推荐项目的自动化测试的时候,就遇到了这种情况。在写测试代码之前,我们对测试代码有一些要求。1. 不能因为测试代码而修改原代码。2. 原有的模块是以dll格式输出的,在做测试的时候,要测的类和函数也只能使用dll的导出类或者函数,而不能将源文件重新编...

  • 注:我实验的环境:win7 x64 经验证xp会有稍微区别,主要是我本次实验hook的api, 从xp到win7微软有了些许改变。 ------------------------------------------------------------------------------------------------------------------------------------

  • windows下hookapi技术 什么叫hookapi?所谓hook就是钩子的意思,而api是指windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是...

  • api hook还是挺常用的, 成熟的方案有微软自己的,  支持32位detours。  还有支持32位、64位的开源库mhook。     按照mhook的api, 自己仿造了一个简化的, 用作学习。   只支持32位的, 要改成64位的话, 要对shellcode进行改写。 思路: 改写函数前面的机器码, 跳转到自己的函数。 要调用原函数时, 先写回原来函数的机器码, 再调用原函数, 调用

  • inline hook简单原理剖析及实现(dll)

global site tag (gtag.js) - google analytics
网站地图