zoukankan      html  css  js  c++  java
  • shell 脚本实战笔记(1)--source/fork/exec的区别

    在linux shell编程中, 随着脚本处理规模的变大, 会嵌套调用子进程. 但父进程以不同的方式调用子进程, 其结果和背后的机制不尽相同.
    这边就简单描述下source/fork/exec调用子进程的区别.

    编写如下脚本

    executor.sh

    1 #! /bin/bash
    2 
    3 echo "script:$0, pid: $$"


    分别以source/fork/exec调用子脚本的代码片段

     1 echo "script:$0 pid: $$, tag 1"
     2 source ./executor.sh
     3 echo "script:$0 pid: $$, tag 2"
     4 
     5 /*
     6 source 执行结果如下:
     7 script:./example.sh pid: 7862, tag 1
     8 script:./example.sh, pid: 7862
     9 script:./example.sh pid: 7862, tag 2
    10 */
     1 echo "script:$0 pid: $$, tag 1"
     2 ./executor.sh
     3 echo "script:$0 pid: $$, tag 2"
     4 
     5 /*
     6 fork 执行结果如下:
     7 script:./example.sh pid: 7862, tag 1
     8 script:./executor.sh, pid: 7863
     9 script:./example.sh pid: 7862, tag 2
    10 */
    1 echo "script:$0 pid: $$, tag 1"
    2 exec ./executor.sh
    3 echo "script:$0 pid: $$, tag 2"
    4 
    5 /*
    6 exec 执行结果如下: 
    7 script:./example.sh pid: 7862, tag 1 
    8 script:/path/to/executor.sh, pid: 7862
    9 */


    从结果中, 我们可以得出: 在进程方面, 以source/exec的方式pid保持一致, 而fork的方式pid不同, 在执行流程方面, source/fork保留了父进程的执行流程,
    exec方式, 则在调用后, 完全覆盖了父进程的后续流程.

    参考: blog.csdn.net/zhuying_linux/article/details/6891436

    总结如下:
    exec/source属于bash内部命令
    source命令: 在当前进程中执行子脚本文件中的各个命令
    exec命令: 并不创建子进程, 用子脚本覆盖父脚本, 并执行
    fork属于系统调用, 会创建一个子进程, 父进程会阻塞等待子进程执行结束, 然后继续往下执行

    source/exec的另一个区别在于,source能使用调用脚本定义的本地变量,exec则不会,exec更像颠覆性的替换

    环境变量的导入, 父进程会把环境变量(本地变量的区别)自动继承给子进程,而且这个方向是单向的,如何查看一个进程的环境变量
    借助如下命令来实现:
    cat /proc/<pid>/environ | tr '' ' '

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/3680296.html
Copyright © 2011-2022 走看看