• 子Shell和子进程

    Shell 中有很多方法产生子进程,比如以新进程的方式运行 Shell 脚本,使用组命令、管道、命令替换等,但是这些子进程是有区别的。

    子进程的概念是由父进程的概念引申而来的。在 Linux 系统中,系统运行的应用程序几乎都是从 init(pid为 1 的进程)进程派生而来的,所有这些应用程序都可以视为 init 进程的子进程,而 init 则为它们的父进程。

    使用pstree -p命令就可以看到 init 及系统中其他进程的进程树信息(包括 pid):

    systemd(1)─┬─ModemManager(796)─┬─{ModemManager}(821)
                │                     └─{ModemManager}(882)
                ├─NetworkManager(975)─┬─{NetworkManager}(1061)
                │                       └─{NetworkManager}(1077)
                ├─abrt-watch-log(774)
                ├─abrt-watch-log(776)
                ├─abrtd(773)
                ├─accounts-daemon(806)─┬─{accounts-daemon}(839)
                │                        └─{accounts-daemon}(883)
                ├─alsactl(768)
                ├─at-spi-bus-laun(1954)─┬─dbus-daemon(1958)───{dbus-daemon}(1960)
                │                         ├─{at-spi-bus-laun}(1955)
                │                         ├─{at-spi-bus-laun}(1957)
                │                         └─{at-spi-bus-laun}(1959)
                ├─at-spi2-registr(1962)───{at-spi2-registr}(1965)
                ├─atd(842)
                ├─auditd(739)─┬─audispd(753)─┬─sedispatch(757)
                │               │                └─{audispd}(759)
                │               └─{auditd}(752)

    本教程基于 CentOS 7 编写,CentOS 7 为了提高启动速度使用 systemd 替代了 init。CentOS 7 之前的版本依然使用 init。

    Shell 脚本是从上至下、从左至右依次执行的,即执行完一个命令之后再执行下一个。如果在 Shell 脚本中遇到子脚本(即脚本嵌套,但是必须以新进程的方式运行)或者外部命令,就会向系统内核申请创建一个新的进程,以便在该进程中执行子脚本或者外部命令,这个新的进程就是子进程。子进程执行完毕后才能回到父进程,才能继续执行父脚本中后续的命令及语句。

    子Shell和子进程

更多...

加载中...