zoukankan      html  css  js  c++  java
  • Linux中关于进程任务处理的几个命令

    linux将程序放到后台执行

    测试脚本test.sh:

    1 i=1
    2 while :
    3 do
    4     echo $i
    5     sleep 1
    6     ((i++))

    一、当在前台运行某个作业时,终端会被该作业占据,从而需要再开一个终端来进行其他的操作,为了避免这种不方便我们可以将作业放到后台执行,主要有两种方式

    1、&命令

    sh test.sh & 

    该命令将脚本放到后台执行,但是标准输出还是会显示到当前终端,影响用户操作,所以最好是将输出重定向到其他文件

    sh test.sh &>/dev/null

    如果需要查看输出结果,也可以定向到一个固定的文件中。

    2、通过ctrl+z;bg等一系列的命令,将已经在前台运行的作业放到后台执行

    如果一个作业已经在前台执行,可以通过ctrl+z将该作业放到后台并挂起。然后通过jobs命令查看在后台执行的作业并找到对应的作业ID,执行bg %n(n为通过jobs查到的作业ID)唤醒该作业继续执行。

    该方式也存在结果会输出到终端上的情况,同样可以用重定向的方法解决

    相关命令:

    jobs------------查看在后台执行的进程

    fg %n----------将后台执行进程n调到前台执行,n表示jobnumber(通过jobs查看的进程编号,而非pid) 

    ctrl+z----------将在前台执行的进程,放到后台并挂起

    bg %n---------将在后台挂起的进程,继续执行

    ctrl+c----------前台进程终止 

    kill %n---------杀掉后台运行的进程,n表示jobnumber(通过jobs查看的进程编号,而非pid) 

    二、当用户注销或者网络中断时,终端后收到SIGHUP信号,从而关闭其所有子进程,以上两种方式会随着终端的关闭而退出,如果我们需要作业在后台执行并不受终端退出的影响,可以用下面两种方式

    1、nohup命令 

    nohup sh test.sh &>/dev/null &

    nohup命令会忽略SIGHUP信号,从而终端退出时不会影响到后台作业 

    nohup $command &
    可以直接在后台运行,但无法调回前台。

    2、将作业挂到新的会话下面

    (sh test.sh &>/dev/null &)或者将sh test.sh &>/dev/null &放到另一个脚本中运行都可以实现 

    将&也放入()后,我们会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的,通过ps查看发现新的作业的PPID是1而不是终端的PID,所以终端退出后不会影响我们的作业

     1 [root@localhost test]# jobs
     2 [1]- 运行中        nohup java -Dfile.encoding=UTF-8 -Dname=Runtime-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test.jar $1 $2 $3 &(工作目录:/home/test)
     3 [2]+ 运行中        nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3 &
     4   
     5 // 使用fg 后,将任务2调至前台运行
     6 [root@localhost test]# fg 2
     7 nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3
     8   
     9 ^Z
    10 // 使用ctrl+Z后,将任务2放置到后台,并暂停
    11 [2]+ 已停止        nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3
    12   
    13 // 使用bg 后,激活任务2的运行
    14 [root@localhost test]# bg 2
    15 [2]+ nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3 &

    三:linux的ps命令

    查询所有
    ps -aux
    查询单个(xxx代表相应应用程序部分名称)
    ps -aux | grep xxx
    
    ps -aux|grep pascal_voc.py这个语句可以查看自己的命令含有pascal_voc.py的所有进程
    ps -ef #显示所有当前进程
    ps aux #显示所有当前进程
    ps -ax #显示所有当前进程
    ps -u pungki #根据用户过滤进程
    ps -aux --sort -pcpu | less #根据 CPU 使用来升序排序
    ps -aux --sort -pmem | less #根据用户过滤进程
    ps -aux --sort -pcpu,+pmem | head -n 10 #查询全10个使用cpu和内存最高的应用,一般自己正在运行的程序就可以显示出来
    ps -C getty #通过进程名和PID过滤
    ps -f -C getty #带格式显示的,通过进程名和PID过滤
    ps -L 1213 #根据线程来过滤进程
    ps -axjf(或pstree) #树形显示进程
    ps -eo pid,user,args # 显示安全信息
    ps -U root -u root u #格式化输出 root 用户(真实的或有效的UID)创建的进程
    

    四、另外screen命令也可以实现相应的功能,并能解决程序需要人机交互的问题

    系统管理员经常需要远程登录服务器
    然后在服务器上跑一些程序
    有个时候
    得跑很长时间(超过12小时)
    这是如果程序没结束就退出远程管理终端
    远程跑的程序很有可能就此当掉
    以前常用的解决方式是用命令nohup
    但是nohup也有很多的问题
    当有了screen
    这一切便都迎刃而解了
    敲入命令screen
    会创建一个跑着shell的单一窗口
    在这里面
    你可以跑你所需要的程序
    然后Ctrl+a d退出刚创建的窗口(回到进入screen前的环境)
    然后再敲入命令screen创建新的终端窗口
    就这样
    你可以建立多个有shell的窗口(这些窗口里都可以跑你自己的应用)
    这样就是你退出远程管理窗口(进入screen的环境)
    你的screen窗间的窗口都不会关闭
    里面跑得应用自然也不会当掉
    用screen -ls可以看所有的screen sessions
    用screen -r sessionid可以进sessionid指定的特定的screen session
    最后screen session不再使用的时候
    screen -r sessionid进去
    exit退出即可

    实例:
    说明看了那么多,让我们用一个实际例子来结束我们今天的学习。
    在我们开启一个screen后,然后使用joe编辑一个文件,之后因为临时需要离开这时就可以运行Ctrl+a d,显示如下:
    [becks@ec-base becks]$ screen
    [detached]
    这个时候当我们运行ps -e 可以看到pts/2这个我刚刚运行的screen正在运行joe
    6264 pts/2 00:00:00 bash
    6354 pts/2 00:00:00 joe
    而当我们回来后想恢复这个session,只需要键入screen -r,而当你有多个session时候,系统将提示你选择一个,如下:
    [becks@ec-base becks]$ screen -r
    There are several suitable screens on:
    6263.pts-1.ec-base (Detached)
    6382.pts-1.ec-base (Detached)
    Type "screen [-d] -r [pid.]tty.host" to resume one of them.
    输入该session的pid进行恢复
    [becks@becks becks]$ screen -r 6263
    想退出screen的session,和退出shell一样,只需要键入exit命令,成功退出后将有以下提示
    [screen is terminating]

  • 相关阅读:
    java实现第七届蓝桥杯阶乘位数
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯打靶
    java实现第七届蓝桥杯打靶
    Mysql 查询一天中,每个小时数据的数量
    mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间
  • 原文地址:https://www.cnblogs.com/henuliulei/p/13255861.html
Copyright © 2011-2022 走看看