bash(下)

进程处理

  • jobs命令

    • -l:列出pid
    • -p:只列出pid
    • -n:只列出和上次比发生变化的作业
    • -r:正在运行的
    • -s:被停止的
    • -x:后面跟一个cmd,可以用%n获取pid
  • 引用后台作业的方式
引用方式 含义
%N 作业编号N
%string string开始的作业
%?string 命令中包含string的作业
%+ 最近被调用的作业(%%同)
%- 第二个最近被调用的作业
  • Ctrl+Z后跟bg可以将正在前台运行的作业转后台

  • kill默认动作是发送TERM信号(-15)

    1
    2
    3
    $ kill %1
    $ kill -QUIT %1 # kill -3 %1
    $ kill -KILL %1 # kill -9 %1
  • ps命令

    • ps列出所有当前终端的进程(第一行是shell,最后一行是ps
    • ps -a列出所有终端的进程(包含当前shell,不包含其它终端的shell
    • ps -eps -ax可以显示所有进程(包括孤儿进程)
  • trap命令

    • 基本格式:

      1
      trap cmd sig1 sig2 ...
    • trap定义的陷阱可以被覆盖,即使这个覆盖发生在函数中

    • cmd置为空字符串可以忽略信号

      SIGHUP会在以下3种情况下被发送给相应的进程:

      1. 终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
      2. session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
      3. 若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。

      系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。

      语句 trap "" HUP 可以使得脚本脱离终端运行。linux提供了nohup命令便于我们更好的使用此功能。

    • cmd置为短线-可以恢复信号的默认操作

  • $$表示当前shellpid$!表示最近调用的后台作业的pid

  • 在命令后面加&使其在后台运行可以利用系统并行性的特点提高效率。这时可能需要在脚本结束时加上wait指令避免其称为孤儿进程

子shell

  • 继承的特性

    • 当前目录
    • 环境变量
    • fd
    • 被忽略的信号

    注意{:.warning} shell变量和未被忽略的信号处理没有被继承

  • 嵌套子shell

    • 将命令放在()中即可

    • 和命令块{}的区别

      • 嵌套子shell符合上述继承的特性,还继承了当前shell的变量,子shell中的变量不能被外部引用
      • 命令块可以看作继承了当前shell所有特性的子shell,而且其变量修改可以被外部引用
    • 一般原则是:如果代码包含变量定义或信号陷阱,则应该使用嵌套子shell代替命令块,除非效率是需要考虑的关键因素

    • ()前面加><可做进程替换用。考虑这个例子:有两个程序prog1prog2,要想比较这两个程序的输出,当然可以创建临时文件,但也可以用进程替换:

      1
      $ cmp <(prog1) <(prog2)