精华内容
下载资源
问答
  • linux process management

    千次阅读 2014-10-16 14:55:37
    CREAT PROCESS fork() | clone(参数,决定父子函数的共享内容) | do_fork() | copy_process() | dup_task_struct() 创建子进程的内核堆栈,复制父进程的进程描述符(task_struct) 进程描述符...
    CREAT PROCESS


    fork()
    |
    clone(参数,决定父子函数的共享内容)
    |
    do_fork()
    |
    copy_process()
    |
    dup_task_struct()
    创建子进程的内核堆栈,复制父进程的进程描述符(task_struct)
    进程描述符的很多成员被清除或者设为初值
    设置子进程的状态task_struct-->state
    设置子进程的权限task_struct-->flags
    设置子进程的进程号task_struct-->PID
    根据clone的参数,拷贝或共享: 打开的文件(task_struct-->fd),
    文件系统信息(task_struct),
    信号处理函数(task_struct-->struct signal_struct *signal;)
    进程的地址空间task_struct-->struct mm_struct *mm, *active_mm;)
    让父子进程平分剩余的时间片。
    |
    子进程被唤醒,调用exec()并执行!
    NOTE

    进程几点要注意的:
    1,进程可以执行一个或者多个程序,一个程序可以被多个进程执行。
    2,受到共享资源的约束,进程会产生约束关系,造成进程会处于不同的状态,比如等待没有一个资源如IO请求,或造成阻塞,直到资源被满足才会释放该进程,进入执行状态。对于时间片用完的进程会进入就绪状态。

    3,临界资源一次只允许一个进程使用。
    EXIT PROCESS

    exit()
    |
    do_exit()
    |
    对task_struct的state(设为PF_EXITING)、mm(调用__exit__mm())、segment(调用sem_exit),file(__exit_files),fs(__exit_fs),signal(exit_sighand),exit_code,notify等资源进行释放。然后调用schedule()调用其他的进程,此时进程处于僵尸状态,进程描述符存在于链表中,直到父进程调用wait4(),才完全释放进程,删除链表中的进程描述符task_struct和共享的资源。


    展开全文
  • linux process退出方式

    千次阅读 2017-10-16 15:51:24
    linux系统里,进程退出通常有5种常见的方式: 直接执行return语句,比如在main函数里,直接用return退出,这与调用exit方法是等价的 直接调用exit,这是ISO C里定义的,包含所有的exit handlers,这些handlers是由...

    在linux系统里,进程退出通常有5种常见的方式:

    • 直接执行return语句,比如在main函数里,直接用return退出,这与调用exit方法是等价的
    • 直接调用exit,这是ISO C里定义的,包含所有的exit handlers,这些handlers是由atexit注册过的;关掉所有的standard I/O streams
    • 调用_exit或_Exit方法,在ISO C里,_Exit结束进程时并不执行exit handlers或signal handlers. 而在UNIX系统里,_Exit和_exit是同步的,并不会flush standard I/O stream.
    • Executing a return from the start routine of the last thread in the process. The
      return value of the thread is not used as the return value of the process,
      however. When the last thread returns from its start routine, the process exits
      with a termination status of 0.
      进程中的线程里执行return
    • 调用pthread_exit,这个通常在线程中使用

    不常见的3种方式

    • 调用abort方法,会产生一个SIGABRT的signal
    • 进程收到特定的signals
    • 前一个线程回复一个cancellation request
    展开全文
  • linux zombie process学习

    2013-09-02 20:12:35
    1. zombie process是什么? zombie process是那些在系统中已经死掉的process, 通过ps -A | grep defunct可以查看系统中有多少zombie process。   2. zombie process是如何产生的? 当一个process被kill掉,比如...

    1. zombie process是什么?
    zombie process是那些在系统中已经死掉的process,
    通过ps -A | grep defunct可以查看系统中有多少zombie process。

    2. zombie process是如何产生的?
    当一个process被kill掉,比如通过
    kill -SIGKILL child_process_pid或者
    kill -SIGTERM child_process_pid
    去kill child process。
    而其parent process却没有调用wait()或waitpid()系统调用时,
    这个child process就会变成zombie process。

    3. zombie process有什么危害?
    你的系统中如果只有一个或几个zombie process,可能并不会对你产生多大影响。
    虽然zombie process已经释放了绝大部分资源,但是仍然占用着一个process descriptor。
    而系统中的process的数量是有限制的,并不是可以无限申请的。
    通过
    sh-3.2# cat /proc/sys/kernel/pid_max
    32768
    可以最大的process个数为32768个(这个应该是configurable的)。
    所以如果zombie process占用了太多的process descriptor的话,
    可能会导致fork新的进程失败。
    所以,如果系统中出现zombie process,最好要查什么原因。

    4. 如何删掉系统中已经存在的zombie process?
    kill -9 zombie_process_pid无法kill掉zombie process。
    要想kill掉zombie process,只能先kill掉他的parent process,
    然后zombie process会变成orphan process,接着init process会
    接管orphan process成为zombie process的parent process,
    接着调用wait(),这样zombie process才会从process descriptor table中
    移除。

    5. 为什么要调用wait()系统调用?
    parent process调用wait()系统调用,相当于parent process确认了child process的结束,
    这样kernel就会释放掉child process所占有的资源,这里说的资源可能特别指的是
    process descriptor。

    6. parent process应该在什么时候去调用wait()系统调用?
    parent process调用wait()比较合适的时机是去monitor SIGCHLD这条signal,
    child process结束时会发送SIGCHLD。
    pseudo code如下:

    #include <signal.h>

    struct sigaction t_act, t_old_act;
    t_act.sa_flags = SA_NODEFER;
    t_act.sa_handler = signal_handler;
    sigaction(SIG_CHILD, &t_act, &t_old_act);

    static void _signal_handler()
    {
        wait(NULL);
    }

    以上如果有理解错误的地方,还请大家帮忙指出来,谢谢!

    展开全文
  • 杀死linux defunct process

    千次阅读 2012-06-19 21:15:45
    1. 什么是defunct process,就是已经死了的process 2. 如何kill掉该process呢,有两种方法:重启机器; 将该process的父亲杀掉 怎样找到defunct process的父亲呢,ps -ef | grep defunct_process_pid   。 ...

    1. 什么是defunct process,就是已经死了的process

    2. 如何kill掉该process呢,有两种方法:重启机器; 将该process的父亲杀掉

    怎样找到defunct process的父亲呢,ps -ef | grep defunct_process_pid


     

    浅议Unix的defunct进程(“僵尸”进程) 本文出自:http://www2.ccw.com.cn 作者: 张道新 赵国明 (2002-04-17 08:02:00)

    在 Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。

    我们知道,每个Unix进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进程终止后,但是父进程尚未读取这些数据之前。利用这一点我们可以用下面的程序建立一个defunct 进程:

    #include <stdio.h>

    #include<sys/types.h>

    main(){

    if(!fork()){

    printf(“child pid=%d\n”, getpid());

    exit(0)

    }

    sleep(20);

    printf(“parent pid=%d \n”, getpid());

    exit(0);

    }

    当上述程序以后台的方式执行时,第8行强迫程序睡眠20秒,让用户有时间输入ps -e指令,观察进程的状态。当父进程执行终止后,再用ps -e命令观察时,我们会发现defunct进程也随之消失。这是因为父进程终止后,init 进程会接管父进程留下的这些“孤儿进程”(orphan process),而这些“孤儿进程”执行完后,它在进程表中的进入点将被删除。如果一个程序设计上有缺陷,就可能导致某个进程的父进程一直处于睡眠状态或是陷入死循环,那么当该子进程执行结束后就变成了defunct进程,这个defunct 进程可能会一直留在系统中直到系统重新启动。

    如果我们将上述程序略作修改,在第8行sleep()系统调用前执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

    由于调度程序无法选中Defunct 进程,所以不能用kill命令删除Defunct 进程,惟一的方法只有重启系统。

    展开全文
  • 1. zombie process是什么? zombie process是那些在系统中已经死掉的process, 通过ps -A | grep defunct可以查看系统中有多少zombie process。 2. zombie process是如何产生的? 当一个process被kill掉,比如...
  • linux删除用户出现user xxx is currently used by process xxx的解决方案 当我们想要删除或更改某个用户名时发现user xxx is currently used by process xxx这个报错,错误的原因可能是因为创建user1再登录到user1后...
  • 实验环境 Kernel Version: 4.15.0-109-generic Operating System: Ubuntu 18.04.5 LTS ...Before looking at the Linux implementation, first a general Unix description of threads, processes
  • linux系统中,使用su root命令从其它用户切换到root用户后,使用userdel命令删除用户时,显示userdel:user xxx is currently used by process 2651 原因: 切换用户后并没有退出登录,某些进程还占用着刚才登陆的...
  • 之前创建了一个普通用户prize,现在想删掉它: [root@VM_0_14_centos /]# userdel prize userdel: user prize is currently used by process 28021  发现原来我克隆了一个会话,另一个窗口还登陆着该用户prize呢...
  • Linux下执行 jps 是快速查看Java程序进程的命令,一般情况下hadoop,hbase,storm等进程都是通过jps查看,有些时候因为进程没有被正常结束,比如资源占用过大时挂掉或者没有结束进程就直接重启计算机,会导致原有...
  • 原因是你切换过多次用户,要么退出重进(或者 ctrl + D 来退出当前用户,直到最后一个)
  • 【报错信息】userdel: user fancy is currently used by process 1973 我把1973这个进程kill了以后仍然存在,也就是没有真正的kill掉
  • Linux中使用userdel命令删除用户时出现错误 “userdel: user XXX is currently used by process XXX” [root@localhost ~]# userdel wqd userdel: user wqdis currently used by process 10479 删除不成功 **出现...
  • 1.最大的可能性就是之前等了root用户了,用exit命令退出(或者ctrl+d),之后就可以正常删除了(我无法删除是这个原因) 2.或许真的有被删除用户部分程序在运行,kill掉
  • 一开始直接用:userdel -r xxx 出现错误:userdel: user xxx is currently used by ...找到需要删除的用户那行,按dd删掉,:wq强制保存退出 [root@ home]#vipw -s 找到用户所属组,也dd删掉,保存:wq或者:wq! ...
  • 有技术人员离职,需要删除系统帐号,但是进行删除操作的时候报:" userdel: user zhoulijiang is currently used by process 1 " # userdel -r zhoulijiang userdel: user zhoulijiang is currently used by ...
  • Linux下为正常关闭java服务导致-process information unavailable(笔录) 今天查看测试tomcat时,无意间发现进程出现:process information unavailable错误, [root@mysql-clone tmp]# jps 2592 Jps 9027 -- ...
  • linux 批量删掉进程

    2020-04-07 16:01:04
    ps uax | grep process_cut_word | grep -v grep | cut -c 9-15 | xargs kill -9 查看带有‘process_cut_word’进程名,并去掉'grep'进程,然后去第9到15位置的字符,并使用'xargs'命令将进程号变成一行,最后使用'...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,473
精华内容 40,589
关键字:

linuxprocess删除

linux 订阅