linux环境下如何让进程在后台运行 -买球官网平台

0顶
0踩

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

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

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

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

解决方法:
1.nohup
只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用>filename 2>&1来更改缺省的重定向文件名。
    [[email protected] ~]# nohup ping www.ibm.com & 
    [1] 3059 
    nohup: appending output to `nohup.out' 
    [[email protected] ~]# 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 
    [[email protected] ~]# 

2. setsid
setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。
    [[email protected] ~]# setsid ping www.ibm.com 
    [[email protected] ~]# 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 
    [[email protected] ~]# 

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

3. &
将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中 当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。
    [[email protected] ~]# (ping www.ibm.com &) 
    [[email protected] ~]# 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 
    [[email protected] ~]# 

新提交的进程的父 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”)
    [[email protected] build]# cp -r testlargefile largefile & 
    [1] 4825 
    [[email protected] build]# jobs 
    [1]   running                 cp -i -r testlargefile largefile & 
    [[email protected] build]# disown -h %1 
    [[email protected] 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 
    [[email protected] build]# logout 

disown 示例2(如果提交命令时未使用“&”将命令放入后台运行,可使用 ctrl-z 和“bg”将其放入后台,再使用“disown”)
    [[email protected] build]# cp -r testlargefile largefile2 
     
    [1]   stopped                 cp -i -r testlargefile largefile2 
    [[email protected] build]# bg %1 
    [1]  cp -i -r testlargefile largefile2 & 
    [[email protected] build]# jobs 
    [1]   running                 cp -i -r testlargefile largefile2 & 
    [[email protected] build]# disown -h %1 
    [[email protected] 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 
    [[email protected] build]# 

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

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

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

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

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

2.使用了 screen 后新进程的进程树
    [[email protected] ~]# screen -r urumchi 
    [[email protected] ~]# ping www.ibm.com & 
    [1] 9488 
    [[email protected] ~]# 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文件,动态链接实现通用替换类,实现代码攻击。另外有文档介绍了其工作原理,再次声明本代码核心类部分非原创。

  • 要填写jmpinstruction的最后4个字节,我们需要它们之间的偏移量payload函数和jmp指令之后的指令。//32位相对跳转jump操作码为e9,后面带着1个32位操作数作为跳转偏移量。

  • 有的时候要写call ,就用下面的 void writecall(dword procaddr,lpvoid lpdata) { byte _data[5]; _data[0]=0xe8; dword oldpro; virtualprotect((lpvoid)(procaddr),5,page_execute_readwrite,&oldpro); memcpy((lpvoid)(_data 1),lpdata,4);//_data是变量的内存地址 memcpy((lpvoid)(procadd

  • #include "stdio.h" #include "tchar.h" #include "windows.h" //offset=目标地址-(jmp指令起始地址 5) //跳转指令解码:[0xe9][offset] // offset:有符号整型,四字节.它等于jmp指令的下一指令地址到目标地址的相对距离 // 计算公式: // offset=目标地址-(jmp指令起始地址 5)

  •         讨论了windows下hook函数的几种方法。提供了一个hook textouta的完整例子。通过createremotethread的方法把hook dll注入到一个普通的应用程序中。hooking imported functions by name调用imported functions时的步骤/实现     在程序中调用从其它模块引入的函数的方法和普通的函数调用有所不同

  • 本文一介绍用修改api头五个字节的方法在win2k下的使用。利用win2k为我们提供了一个强大的内存api操作函数---virtualprotectex,writeprocessmemeory,readprocessmemeory,有了它们我们就能在内存中动态修改代码了,其原型为: bool virtualprotectex( handle hprocess, // 要修改内存的进程句柄 lpvo

  • 在windows 操作系统里面,api是指由操作系统提供功能的、由应用程序调用的函数。这些函数在windows操作系统里面有上千个之多,分布于不同的dll文件里面或者exe文件里面。应用程序通过调用这些函数来获得一些功能的支持。api hook技术是一种用于改变api执行结果的技术,例如翻译软件可以通过hook textout函数或其他相关的api函数,在执行系统真正的api之前,截获textou

  • 我一直在寻找能用,通用,简短的x64远跳河远call指令 现在用的跟大家分享一下,哪位大牛有更好的希望可以指点一下。 还有pushad/popad在x64下有什么好的替代品么?求指点。 远跳: 代码: push 地址的低32位 mov dword ptr ss:[rsp 4],地址的高32位 ret 远call: 代码: call @next   //e8 00

  • 前面已经写过两次inline hook的博文了,第一篇为:《c/c hook api(原理深入剖析之-loadlibrarya)》,这篇博文的方法是通过修改任意函数的前面n个字节,实现跳转并进入到我们自定义的hook函数里,执行完毕我们的hook函数之后,再直接调用被hook的函数。第一篇的方法没有考虑多线程的情况,所以在多线程环境下会有问题。第二篇为:《inline hook api 改进版(hot-patching)》,这篇的初衷是为了解决多线程的问题,因为这种方式是一直hook的,直到程序结束。

  • 核心代码从网上找的,但原始函数调用一直有问,经过分析 整理并测试成功。   dword oldprotect2; byte pdata[10]; //保留原始函数的调用 farproc funaddr; //生成新的函数调用 typedef int ( winapi recvfromfn)( socket s, char *buf, int len, int flags, sock

  • 1,apihook 概述:概述:注入windows画图工具(32位),让画图工具启动后,只要画图工具调用要hook的api,就能弹出一个对话框;以上关键使用apihook; apihook也是杀软主动防御的一个基础; 2,提前搞清楚几个问题 2.1 a和w版本 windowsapi有a和w版本,如果使用a版本,a版本最后还是会调用w版本,所以尽可能hook的是w版本;这里涉及到其他问

  • inline hook jmp 到没用的地方 pushad,pushfd, 做自己的事 popfd,popad. 加上被覆盖的代码 jmp 到被覆盖代码的下一行 注意点 位置的选择: <1> jmp/call指令至少占用5个字节 <2> 绕开全局变量,因为全局变量的硬编码会随着指令变 <3> 根据业务来决定在哪里hook:过滤参数...

  • 文章作者:mgf信息来源:邪恶八进制信息安全团队(www.eviloctal.com) hook api是一个永恒的话题,如果没有hook,许多技术将很难实现,也许根本不能实现。这里所说的api,是广义上的api,它包括dos下的中断,windows里的api、中断服务、ifs和ndis过滤等。比如大家熟悉的即时翻译软件,就是靠hook textout()或exttextout()这两个函数实

  •  jmp  hook  iat  detours win9x   系统中,系统dll被装入实际的物理存储器,然后映射到每个进程的0x80000000~0xbfffffff共享内存区,如果修改这段区域的dll代码,则对于所有进程都有效(实际win98对主要的系统dll作了保护,除非进入ring0才能修改)。        win2000/nt   的进程空间不存在共享内存区,尽管dll被装入

  • 一丶什么是hook,以及hook能干啥 首先这一个小标题主要介绍神马是hook,如果知道的,则不用看了. 这里我偷袭啊懒,贴出hook的意思https://blog.csdn.net/qq_34573534/article/details/103702378 hook,英文单词中成为钩子,铁钩的意思,在我们编程中就是挂钩的意思。 我们要hook api,则是要把这个api进行挂钩,让其...

  • 1.iat_hook iat是程序中存储导入函数地址的数据结构,如果hook了导入函数地址。就可以在函数调用的时候,将函数流程hook到我们指定的流程。但是我个人觉得这种方式最好要结合dll注入的方式,如果单纯的使用hook,那么就需要将需要执行的操作的shellcode写入目标进程,如果操作复杂,可能需要的shellcode量特别大,所以我们需要借助dll注入,这样就将我们需要执行的代码写入...

global site tag (gtag.js) - google analytics