精华内容
下载资源
问答
  • t fork(void)pid_t vfork(void)---这种方法用的很少写时拷贝技术退出进程1、main函数中的return2、库函数 void exit(int status)3、系统调用接口 _void exit(int status)查看上一次系统调用使用错误的原因 ...

    创建进程

    pid_t fork(void)

    通过复制父进程创建子进程,父子进程代码共享,资源独有

    fork()的返回值:(用于区分父子进程)
    父进程,返回子进程的pid,大于0
    子进程,返回0
    出错时返回-1
    在这里插入图片描述
    在这里插入图片描述

    pid_t vfork(void)—这种方法用的很少

    –创建一个子进程并阻塞父进程,父子进程共用虚拟地址空间
    –如果父子进程同时运行会造成栈混乱,所以vfork()阻塞了父进程,让子进程先运行,直到子进程exit退出或者程序替换后,父进程才能继续运行

    写时拷贝技术

    通过复制父进程创建子进程,所以父子进程一开始映射的是同一块物理内存地址,但是当数据需要发生改变时,则重新为子进程开辟新的空间,将数据拷贝过去
    优点:创建子进程的效率高

    退出进程

    1、main函数中的return

    只有main函数中的return可以退出进程,其他地方不可以

    2、库函数 void exit(int status)

    可以在任意位置调用退出进程,退出前刷新缓冲区

    3、系统调用接口 _void exit(int status)

    可以在任意位置调用退出进程,不刷新缓冲区
    status可以视为进程的退出返回值,即程序的退出原因,保存在pcb中
    使用ehco &?命令 可以获取 上一个已退出进程的status值

    查看上一次系统调用使用错误的原因

    1、void perror(const char* s);

    打印一个系统错误信息
    const char* s为用户自定义的备注信息,例如:

    在这里插入图片描述
    在这里插入图片描述
    表示程序运行成功,未出现错误。
    2、char *strerror(int errnum);

    errnum–全局变量,程序错误序号
    通过程序错误序号获取错误信息

    展开全文
  • linux中保证进程退出

    千次阅读 2018-07-31 22:33:02
    1. 需求  在实际编写应用程序的时候,可能会出现如下场景,你正在开发阶段,但是你的上层,可能也要测试,此时,你的程序不定时的因为某种原因会蹦掉,但其实你不关心,因为在... (2)在进程退出的时候,重启进...

    1. 需求

        在实际编写应用程序的时候,可能会出现如下场景,你正在开发阶段,但是你的上层,可能也要测试,此时,你的程序不定时的因为某种原因会蹦掉,但其实你不关心,因为在开发阶段,具体原因留待以后解决,此时,一个保证你程序能自动重启的机制就需要了。


    2. 正文

        2.1 保证进程不退出的思路大致是这样的:

        (1)用 ps 查看进程

        (2)在进程退出的时候,重启进程

    有了思路,我们还要确认的一点是,多长时间去执行一会这个步骤。假设10s,接下来便是用crontab来每10s查看一下进程中有没有ss.out进程,如果没有,将重新启动进程。

        2.2 代码

        crontab的设置如下:

    > crontab -e

    这里可能会提示没有 /var/spool/cron/crontabs 这个文件夹,我们创建即可

    > mkdir -p /var/spool/cron/crontabs

    在弹出的编辑器里输入如下内容

    * * * * * /home/root/retain_program.sh
    * * * * * sleep 10; /home/root/retain_program.sh
    * * * * * sleep 20; /home/root/retain_program.sh
    * * * * * sleep 30; /home/root/retain_program.sh
    * * * * * sleep 40; /home/root/retain_program.sh
    * * * * * sleep 50; /home/root/retain_program.sh
    

    【1】crontab设置的意思是没1分钟,执行上边代码中的内容,这个的意思就是每10s执行一次 /home/root/retain_program.sh 脚本

    接下来我们编写 /home/root/retain_program.sh 脚本

    #!/bin/sh
    
    cnt=`ps | grep ss.out | grep -v "grep" | wc -l`
    
    if [ $cnt -eq 0 ]
    then
        echo `date` >> /home/root/1.txt
        /home/root/ss.out&
    fi
    

    【1】在每次检查到没有 ss.out 进程的时候,把此时的时间追加的形式写到1.txt中,并且重新启动进程ss.out

    启动crontab守护进程

    > crond

     

    展开全文
  • 小葫芦2017-04-18 10:08:121楼虽然你将进程...解决方案1,可以参考How to make a Python script run like a service or daemon in Linux,教你如何在linux下编程将进程做成daemon进程。示例程序比较长,我放在最后讲...

    小葫芦2017-04-18 10:08:121楼

    虽然你将进程放在后台执行,但是并没有跟启动该进程的终端detach,因此,父进程shell终端关闭,子进程也将被关闭。

    解决方案1,可以参考How to make a Python script run like a service or daemon in Linux,教你如何在linux下编程将进程做成daemon进程。示例程序比较长,我放在最后讲解吧。

    解决方案2,有python库可以将自身进程daemon化,而且挺多的。比如,python-daemon。使用示例如下:

    import daemon

    def do_main_program():

    pass # 你的程序

    with daemon.DaemonContext():

    do_main_program()

    补充解决方案1的处理:

    # -*- coding: utf-8 -*-

    import os

    import sys

    import datetime

    def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):

    try:

    pid = os.fork()

    if pid > 0:

    sys.exit(0) # Exit first parent.

    except OSError, e:

    sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))

    sys.exit(1)

    # Decouple from parent environment.

    os.chdir("/")

    os.umask(0)

    os.setsid()

    # Do second fork.

    try:

    pid = os.fork()

    if pid > 0:

    sys.exit(0) # Exit second parent.

    except OSError, e:

    sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))

    sys.exit(1)

    # Redirect standard file descriptors.

    si = file(stdin, 'r')

    so = file(stdout, 'a+')

    se = file(stderr, 'a+', 0)

    os.dup2(si.fileno(), sys.stdin.fileno())

    os.dup2(so.fileno(), sys.stdout.fileno())

    os.dup2(se.fileno(), sys.stderr.fileno())

    if __name__ == "__main__":

    daemonize()

    # 然后开始执行你的其他程序。

    展开全文
  • 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了coredump技术以找到崩溃原因,即确定进程退出时正在执行的函数是哪个,其状态如何。如果系统开启了coredump,准确的说如果当前的shell环境开启了...

    最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了coredump技术以找到崩溃原因,即确定进程退出时正在执行的函数是哪个,其状态如何。

    如果系统开启了coredump,准确的说如果当前的shell环境开启了coredump,当前shell环境下的程序崩溃退出时,会把当时进程的栈的内存状态写入core文件。使用gdb可以查看这个core文件中保存的栈的状态,gdb a.out core。(关于coredump的开启和对shell的理解,请参考本人另一篇博客《使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因解析》,关于gdb请参考《gdb调试命令的使用及总结》)

    core文件生成的位置默认是可执行文件所在的位置,名称默认为core,其位置和名称是可以设置的,我的设置为:

    mkdir /home/corefile

    echo “/home/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern

    这样,生成的core文件会放在/home/corefile目录下,core文件名会以core-%e-%p-%t的形式出现,其中%e表示可执行文件的名称,%p表示进程,%t表示生成core文件的时间(注意是unix时间)。

    下面是一个可以导致coredump的例程:

    5429daf149f95261555717cb771354ed.png

    划线处是会导致coredump处。执行后会在/home/corefile目录下产生以下文件:

    [root@localhostwin7]# ls /home/corefile/

    00c506a2c78b9c722291cb218c942e8f.png

    a.out是可执行文件名,5082是PID,1490760381是产生该文件的unix时间。把a.out 和core文件放在一个目录下,使用命令:

    gdb a.out core-a.out-5082-1490760381

    进入gdb,然后使用backtrace命令,即可看进程退出时的栈的内存状态,如下所示:

    375a9b32eb73a91e756a4f05810632d2.png

    可见,进程退出时,执行的最后一个函数是square函数。 ————————————————

    总结

    以上所述是小编给大家介绍的Linux下利用coredump技术追查进程崩溃原因,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    展开全文
  • 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了coredump技术以找到崩溃原因,即确定进程退出时正在执行的函数是哪个,其状态如何。 如果系统开启了coredump,准确的说如果当前的shell环境开启了...
  • 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了coredump技术以找到崩溃原因,即确定进程退出时正在执行的函数是哪个,其状态如何。 如果系统开启了coredump,准确的说如果当前的shell环境开启了...
  • 一、僵死进程 1、了解进程的结构 (1)进程分为两部分: PCB(进程控制块):控制一个进程,...因为在PCB中有一个退出码,用来查看进程退出原因,如果进程实体被释放,用户就要查看进程退出原因,所以如果要看退出码
  • 进程等待 概念:进程等待就是子进程的状态改变 ...作用:避免产生僵尸进程。一个进程在终止时会关闭所有的文件...那么父进程便可以通过调用wait()函数或者waitpid()函数来查看进程退出信息,然后可以彻底清...
  • 如果子进程先于父进程退出,父进程没有调用wait()/waitpid()函数等待子进程结束来回收子进程资源,此时子进程处于“僵尸状态”,占用进程号和系统资源。可以通“ps”命令查看是否存在僵尸进程, 带有“< defunct ...
  • 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了coredump技术以找到崩溃原因,即确定进程退出时正在执行的函数是哪个,其状态如何。 如果系统开启了coredump,准确的说如果当前的shell环境开启...
  • shell退出后 后台进程关闭的原因

    千次阅读 2015-06-04 11:03:31
    linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了。都是退出登录为什么前者后台...
  • linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了。都是退出登录为什么前者后台...
  • linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了。都是退出登录为什么前者后台...
  • linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了。都是退出登录为什么前者后台...
  • 如果父进程由于某种原因退出了(假设是崩溃,调试或收到了web系统的命令退出),再重启父进程,端口被子进程监听,导致bind失败。 因为没想到问题原因,看代码也看不出来,就搁了一段时间。...
  •  简述一下我遇到的情况,在煲机一段时间之后(大概18小时),进程退出。通过gdb调试和及时保存内存CPU使用情况,基本可以排除内存泄漏和段错误的原因。然后开始排查是否是文件连接过多的原因,即fopen文件没有相应...
  • 僵尸进程的产生原因

    千次阅读 2013-11-07 11:42:16
    判断僵尸进程的一个方法是使用ps命令查看进程状态。如果进程状态是Z,说明这是一个僵尸进程。   在多进程的程序中,父进程会启动若干个子进程来处理任务。当子进程退出后,除了在进程表中占用的一个进程表项,子...
  • linux指令查看tomcat日志

    千次阅读 2016-07-08 20:22:43
    实际开发中经常遇到查看远程tomcat日志,来查找原因:因此总结了一些常用的linux指令 1、先切换到:cd usr/local/tomcat5/logs 2、tail -f catalina.out3、这样运行时就可以实时查看运行日志了 Ctrl+c 是退出tail...
  • 3.查看进程退出时刻的系统日志,没有对应信息。 一般如果异常退出,/var/log/message里面应该会有相关的信息,比如killed。 4.由于有监控系统运行情况,重启时刻内存使用率不高,2%左右。系统内存是16GB,CPU是16核...
  • 原因服务器内存过小,而mysql占用过多,导致被linux内核杀死。首先通过free命令来查看内存,应该剩余不多。free -m解决办法解决办法分为2个步骤,缺一不可。调整缓冲区占用大小这个值默认是128M,可以改成64M,32M等...
  • 僵死进程

    2020-07-20 15:59:40
    一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。 2. Linux系统中如何查看是否有僵死进程 ...
  • 使用 ps 或者 top 可以查看进程的状态,这些状态包括运行、空闲、不可中断睡眠、可中断睡眠、僵尸以及暂停等。其中,我们重点学习了不可中断状态和僵尸进程: 不可中断状态,一般表示进程正在跟硬件交互,为了保护...
  • Linux - 操作系统信号

    2018-04-01 17:35:00
    linux操作系统提供的信号 kill -l # 查看linux提供的信号 ...trap "echo aaa" 2 3 15 # shell使用 trap ...例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号 # 2(主动式) 通过系统...
  • 1 kill -l # 查看linux提供的信号 2 trap "echo aaa" 2 3 15 # shell使用 trap 捕捉退出信号 3 4 # 发送信号一般有两种原因: ...例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SI...
  • linux系统和

    2018-11-08 22:30:51
    Linux命令的基本使用 使用原因 在工作中,大量的 服务器维护工作 都是在 远程 通过 SSH 客户端 来完成的,并没有图形界面,所有的维护工作都需要通过命令来完成。如 磁盘操作、文件存取、目录操作、进程管理、...
  • pthread_create在循环中,几乎瞬间创建5个线程,但只有第1个线程有机会输出(或者第2个也有,也可能没有,取决于内核调度)如果第3个线程执行了exit,将整个进程退出了,所以全部线程退出了。 所以,多线程环境中,...
  • Linux中 “there are stopped jobs”

    千次阅读 2018-05-16 20:50:10
    问题:在linux或者mac上 使用tail -f XX.log时,按住command+z或者ctrl+z,退出当前的tail窗口,,然后输入exit,发现无法退出服务器原因: 这是由于按下了Ctrl+Z之后使程序或者进程被挂起。可以通过命令输入使之...

空空如也

空空如也

1 2 3 4 5
收藏数 95
精华内容 38
关键字:

linux查看进程退出原因

linux 订阅