zoukankan      html  css  js  c++  java
  • 优先级设置nice值 ; 给进程发送信号kill、nohup、setsid、 screen;查看网络状态netstat;proc文件系统

    shell管理进程

    一、优先级设置

    可以在启动进程时⽤nice命令设置设置优先级

    设置进程的nice值
    # 设置进程的优先级
    nice [-n <优先级>] [--help] [--version] [执⾏指令]
    nice -n -11 bash test.sh
    
    #选项介绍
    若 nice命令未指定优先级的调整值,则以缺省值10来调整程序运⾏优先级,既在当前程序运⾏优先级基础之上增加10。
     -n <优先级> 指定设置优先级; 
    	普通用户:(0~19)
    	超级用户:(-20~19)
     --help 帮助信息;
     --version 版本信息;
     
    # 执⾏范例:让命令以新的优先级执⾏
    [root@localhost ~]# $ nice -n 5 ls # nice -n -20 命令
     
    # ps -l 命令
    其中的⼏个重要信息有:
    UID : 代表执⾏者的身份
    PID : 代表这个进程的代号
    PPID :代表这个进程是由哪个进程发展衍⽣⽽来的,亦即⽗进程的代号
    PRI :代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏
    NI :代表这个进程的nice值
    PRI即进程的优先级,此值越⼩进程的优先级别越⾼。⽽NI,也就是我们所要说的nice值(通过nice
    命令设置),其表示进程可被执⾏的优先级的修正数值。如前⾯所说,PRI值越⼩越快被执⾏,那么加
    ⼊nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。
    所以,nice命令设置的优先级不是程序最终的优先级,⽽只是优先级的修正数值。
    renice命令允许⽤户修改⼀个正在运⾏的进程的优先权。
    	
    # 对已运⾏的进程设置新的优先级
    renice [设置优先级] pid
    [root@localhost ~]# renice -20 11111
    

    二、给进程发送信号

    kill命令
    [root@localhost ~]# kill -l # 列出所有⽀持的信号
    =====================解释==========================
    # HUP(1): 1、挂起信号 2、往往可以让进程重新加载配置
    本信号在⽤户终端连接(正常或⾮正常)结束时发出, 通常是在终端的控制进程结束时, 通知同⼀session内的各个作业, 这时它们与控制终端不再关联。
    登录Linux时,系统会分配给登录⽤户⼀个终端(Session)。在这个终端运⾏的所有程序,包括前台进程组和后台进程组,⼀般都 属于这个 Session。当⽤户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终⽌进程,因此前台进 程组和后台有终端输出的进程就会中⽌。不过,可以捕获这个信号,⽐如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。此外,对于与终端脱离关系的守护进程,这个信号⽤于通知它重新读取配置⽂件。
    # INT(2): 中断, 通常因为按下ctrl+c⽽产⽣的信号,⽤于通知前台进程组终⽌进程。
    # QUIT(3): 退出,和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产⽣core⽂件, 在这个意义上类似于⼀个程序错误信号。
    # TSTP(20): 停⽌进⾏运⾏,通常因为按下ctrl+z⽽产⽣的信号
    # KILL (9)⽤来⽴即结束程序的运⾏. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终⽌不了,可尝试发送这个信号。
    # TERM(15):终⽌,是不带参数时kill默认发送的信号,默认是杀死进程,与SIGKILL不同的是该信号可以被阻塞和处理。通常⽤TERM信号来要求程序⾃⼰正常退出,如果进程终⽌不了,我们才会尝试SIGKILL。
    # CONT(18) 被暂停的进程将继续恢复运⾏
    # SIGSTOP(19) 暂停进程
    # SIGCHLD⼦进程结束时, ⽗进程会收到这个信号。如果⽗进程没有处理这个信号,也没有等待(wait)⼦进程,⼦进程虽然终⽌,但是还会在内核进程表中占有表项,这时的⼦进程称为僵⼫ 进程。这种情 况我们应该避免(⽗进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派⽣的⼦进程,或者⽗进程先终⽌,这时⼦进程的终⽌⾃动由init进程来接管)。
    
    # 参数
    中断信号
    	ctrl + c
    	ctrl + z
    
    	INT(2) : 
    		kill -[信号名称|信号ID] pid
    		
    		kill -SIGINT  PID
    		kill -INT     PID
    		kill -2       PID 
    
    退出信号:
    	ctrl + d
    
    暂停信号:将进程暂停
    	SIGTSTP(20)
    		kill -20 PID 
    		kill -SIGTSTP PID 
    		kill -TSTP PID
    
    杀死进程信号
    	SIGKILL
    		kill -9 PID 
    		kill -SIGKILL PID
    		kill -KILL PID
    注:不能够被捕捉
    
    终止信号
    	SIGTREM
    		kill -15 PID 
    		kill -SIGTERM PID
    		kill -TERM PID
    
    注:优雅终止进程
    
    暂停和恢复信号
    	SIGCONT : 恢复
    	SIGSTOP :暂停
    
    重载信号
    	SIGHUP(1)
    
    关于hup信号
    我们知道,当⽤户注销(logout)或者⽹络断开或者终端关闭(注意注意注意,⼀定是终端整体关闭,不是单纯的exit)时,终端都会收到Linux HUP信号(hangup)信号,然后终端在结束前会关闭其所有⼦进程。
    如果我们想让我们的进程在后台⼀直运⾏,不要因为⽤户注销(logout)或者⽹络断开或者终端关闭⽽⼀起被⼲掉,那么我们有两种解决⽅案
    ⽅案1:让进程忽略Linux HUP信号
    ⽅案2:让进程运⾏在新的会话⾥,从⽽成为不属于此终端的⼦进程,就不会在当前终端挂掉的情况下⼀起被带⾛。
    
    nohup命令

    针对⽅案1,我们可以使⽤nohup命令,nohup 的⽤途就是让提交的命令忽略 hangup 信号,该命令通 常与&符号⼀起使⽤

    nohup 的使⽤是⼗分⽅便的,只需在要处理的命令前加上 nohup 即可,但是 nohup 命令会从终端解除进程的关联,进程会丢掉STDOUT,STDERR的链接。标准输出和标准错误缺省会被重定向到nohup.out ⽂件中。⼀般我们可在结尾加上"&"来将命令同时放⼊后台运⾏,也可⽤">filename2>&1"来更改缺省的重定向⽂件名。
    
    nohup [执行的命令] &
    后台启动,会在当前目录生成一个nohub.out文件,用于执行的命令的输出
    要退出会话窗口最好先exit或者logout   或使用nohup
    [root@localhost ~]# nohup ping www.baidu.con &>/dev/null &  #即使关闭终端2,子进程不会kill
    
    setsid命令

    针对⽅案1,我们还可以⽤setsid命令实现,原理与nohup是⼀样的,setid是直接将进程的⽗pid设置成1, 即让运⾏的进程归属于init的⼦进程,那么除⾮init结束,该⼦进程才会结束,当前进程所在的终端结束 后并不会影响进程的运⾏

    1、在终端2中执⾏命令
    [root@egon ~]# setsid ping www.baidu.com # 也可以在后⾯加&符号,丢后台运行 2、关闭终端2
    3、在终端1中查看
    [root@egon ~]# ps -ef |grep [p]ing
    root 102335 1 0 17:53 ? 00:00:00 ping www.baidu.com
     setsid : 实际上开了一个孤儿进程
     
    等价于[root@egon ~]# (ping www.baidu.com) #在子shell中提交任务
    
    screen命令
    # 1、安装
    [root@egon ~]# yum install screen -y
    
    # 2、运⾏命令
    ⽅式⼀:开启⼀个窗⼝并⽤-大S指定窗⼝名,也可以不指定
    [root@egon ~]# screen -S egon_dsb
    
    Screen将创建⼀个执⾏shell的全屏窗⼝。你可以执⾏任意shell程序,就像在ssh窗⼝中那样。
    在该窗⼝中键⼊exit则退出该窗⼝,如果此时,这是该screen会话的唯⼀窗⼝,该screen会话退
    出,否则screen⾃动切换到前⼀个窗⼝。
    
    ⽅式⼆:Screen命令后跟你要执⾏的程序
    [root@egon ~]# screen vim test.txt
    Screen创建⼀个执⾏vim test.txt的单窗⼝会话,退出vim将退出该窗⼝/会话。
    
    # 3、原理分析
    screen程序会帮我们管理运⾏的命令,退出screen,我们的命令还会继续运⾏,若关闭screen所在
    的终端,则screen程序的ppid变为1,所以screen不会死掉,对应着它帮我们管理的命令也不会退
    出测试略
    
    # 4:重新连接会话
    在终端1中运⾏
    [root@egon ~]# screen
    [root@egon ~]# n=1;while true;do echo $n;sleep 1;((n++));done
    [root@egon ~]# 按下ctrl+a,然后再按下ctrl+d,注意要连贯,⼿别哆嗦,
    [root@egon ~]# 此时可以关闭整个终端,我们的程序并不会结束
    打开⼀个新的终端
    [root@egon ~]# screen -ls
    There is a screen on:
     109125.pts-0.egon (Detached) 1 Socket in /var/run/screen/S-root. [root@egon ~]# screen -r 109125 # 会继续运⾏
    [root@egon ~]#
    注意:如果我们刚开始已经⽤screen -S xxx指定了名字,那么我们其实可以直接
    screen -r xxx ,就⽆须去找进程id了
    
    远程演示
    # 在终端1: [root@egon ~]# screen -S egon_av
    # 开启⼀个新的终端,在该终端执⾏的命令,终端1会同步显示
    [root@egon ~]# screen -x egon_av
    

    三、查看网络状态

    netstat
    netstat主要用来查询系统端口相关问题
    
    注:要使用netstat,需要安装yum install -y net-tools
    
    # netstat常用参数
    -t : 打印tcp链接的进程
    -u : 打印UDP链接的进程
    -l : 监听
    -p : 打印进程的PID
    -n : 不反解,不将ip地址解析成域名同时不将端口解析成对应的协议名称
    
    netstat -nutlp
    [root@tianyun ~]# netstat -tnlp # 查看正在监听的,且使⽤tcp协议的进程
    
    [root@egon ~]# netstat -an |grep :22  #查看端口号
    [root@egon ~]# netstat -an |grep :80
    [root@egon ~]# lsof -i:22
    

    四、proc文件系统

    [root@localhost ~]# du -sh /proc
    

    cpu:/proc/cpuinfo

    [root@localhost ~]# grep "processor" /proc/cpuinfo # 逻辑cpu个数
    processor : 0 [root@localhost ~]# grep "physical id" /proc/cpuinfo # 物理cpu个数
    [root@localhost ~]# grep "cpu cores" /proc/cpuinfo # cpu核数
    cpu cores : 1
     
    [root@localhost ~]# cat /proc/cpuinfo
    ==flags
    lm(64位)
    vmx ⽀持虚拟化 Intel
    svm ⽀持虚拟化 AMD
    [root@localhost ~]# egrep --color 'lm|vmx|svm' /proc/cpuinfo
    [root@localhost ~]# lscpu
    

    内存:/proc/meminfo

    # 查看内存
    [root@egon ~]# less /proc/meminfo
    [root@egon ~]# free -wm
    [root@egon ~]# free -m
    需要注意的是
    free表示的是当前完全没有被程序使⽤的内存;
    ⽽cache在有需要时,是可以被释放出来以供其它进程使⽤的(当然,并不是所有cache都可以释
    放,⽐如当前被⽤作ramfs的内存)。
    ⽽available才是真正表明系统⽬前可以提供给新启动的应⽤程序使⽤的内存。
    /proc/meminfo从3.14内核版本开始提供MemAvailable的值;在2.6.27~3.14版本之间,是
    free程序⾃⼰计算available的值;早于2.6.27版本,available的值则同free⼀样。
    [root@egon ~]# man free # 看⼀眼写的清清楚楚
    

    内核启动参数:/proc/cmdline

    [root@localhost ~]# cat /proc/cmdline
    BOOT_IMAGE=/vmlinuz-3.10.0-1127.13.1.el7.x86_64 root=UUID=84b5cfa6-b0dc- 4d7a-a8fd-0302f0eb2f04 ro rhgb quiet LANG=zh_CN.UTF-8 
    [root@localhost ~]# uptime
    17:42:40 up 1 day, 1:33, 2 users, load average: 0.00, 0.01, 0.05
    
  • 相关阅读:
    [SDOI2009]学校食堂Dining
    [SCOI2005]最大子矩阵
    [AHOI2009]中国象棋
    洛谷P1850 换教室(概率dp)
    洛谷[1007]梦美与线段树(线段树+概率期望)
    洛谷P3577 [POI2014]TUR-Tourism
    CF1045G AI robots(动态开点线段树)
    洛谷P4721 【模板】分治 FFT(分治FFT)
    洛谷P4726 【模板】多项式指数函数
    洛谷P4173 残缺的字符串(FFT)
  • 原文地址:https://www.cnblogs.com/caodan01/p/14597868.html
Copyright © 2011-2022 走看看