zoukankan      html  css  js  c++  java
  • 浅析linux 下shell命令执行和守护进程

    执行shell脚本有以下几种方式
    
    1、相对路径方式,需先cd到脚本路径下
    [root@banking tmp]# cd /tmp  
    [root@banking tmp]# ./ceshi.sh 
    脚本执行成功 
    
    2、绝对路径方式
    [root@banking tmp]# /tmp/ceshi.sh   
    脚本执行成功 
    
    3、bash命令调用
    [root@banking /]# bash /tmp/ceshi.sh
    脚本执行成功 
    
    4、. (空格)  相对或绝对方式
    [root@banking /]# . /tmp/ceshi.sh   
    

    说下几种方式的区别
    第一种和第二种没有什么区别,两种方式都需要提前赋予脚本以执行权限。
    第三种是把脚本当做bash的调用来处理,所以,脚本不需要有执行权限就可以执行。
    前三种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
    第四种是使脚本内容在当前shell里执行,而不是单独开子shell执行。
    开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,不做特殊通道处理的话,父shell是不可见的。
    而在当前shell中执行的话,则所有设置的环境变量都是直接生效可用的。

    验证:
    [root@banking /]# cat /tmp/ceshi.sh   
    					top  
    1、前三种执行方式下的pstree显示
    init──├
       ├─sshd─┬─sshd───bash───bash───top  
       │      └─sshd───bash───pstree  
     
    
    2、第四种执行方式下的pstree显示
    init──├
       ├─sshd─┬─sshd───bash───top    
    	  │		 └─sshd───bash───pstree 
    
    3.shell脚本后台执行
    [root@banking /]# cat /tmp/ceshi1.sh  
    					./a.out &  #(a.out是个while死循环程序)
    运行 ceshi1.sh  然后运行 pstree
    init──├─a.out
       ├─sshd─┬─sshd───bash
       │      └─sshd───bash───pstree
    可以看到a.out 已经过继给了init进程  
    4. 直接终端运行a.out 
    [root@banking /]#./a.out &
    运行 pstree
    init──├
       ├─sshd─┬─sshd───bash───a.out
       │      └─sshd───bash───pstree
    
    5、验证环境变量设置的继承关系及可见关系 建立两个脚本,father.sh和subshell.sh。其中father.sh调用subshell.sh 
    [root@banking /]# cat /tmp/father.sh 
    v_ceshi='father' #-------父shell中定义变量 
    echo "以子shell方式调用脚本" 
    /tmp/subshell.sh 
    echo "输出v_ceshi值为${v_ceshi}" 
    echo "" 
    echo "在当前shell中执行脚本" 
    . /tmp/subshell.sh 
    echo "输出v_ceshi值为${v_ceshi}" 
    
    [root@banking /]# 
    [root@banking /]# cat /tmp/subshell.sh 
    v_ceshi=son 
    执行结果为: 
    [root@banking /]# /tmp/father.sh 
    以子shell方式调用脚本 
    输出v_ceshi值为father 
    在当前shell中执行脚本 
    输出v_ceshi值为son
    

     二:关于守护进程 (唯一用途是为其他进程提供服务)

       linux shell 中的主要目的是使当前程序脱离当前bash(终端或者sshd)。

    关闭终端有两种方式,一种是点叉,这时候,你关闭的是(gnome-terminal or sshd)这个进程,而Bash是它的子进程,它会将Bash杀死,而Bash的所有子进程都会因为父进程死了而同时死掉。

    而如果你是在终端里输exit命令或者ctrl-d,实际上是Bash自己退出,bash在自己退出时,会将自己启动的在后台工作的子进程脱离,然后再退出,因此这种方式不会导致该终端启动的后台程序关闭。

    因为每次执行需要保护命令后,并不能保证都会记得ctrl-d 这种方式退出,所以不推荐这种方式实现守护进程。推荐方法是利用shell 脚本程序(运行时不要使用第四种执行方式),该原理上面已经解释过。shell 脚本中的后台程序会过继给init进程,从而脱离终端。

    例:

    [root@banking /]#cat run.sh
    ./a.out &
    [root@banking /]#./run.sh
    

      

  • 相关阅读:
    C++调用Java的Jar包(带参数)
    SOA创建Form表单
    vs2013 IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
    idea无法正常使用SVN的解决方法
    关于C语言中print输出问题
    TC怎么在代码中实现选中一个TCCcomponent对象?
    Unity 1.0 中文文档:1 Unity 简介
    Unity(四):使用场景Ⅰ:建立类型映射
    这个世界上没有白干的活
    Unity(三):快速入门
  • 原文地址:https://www.cnblogs.com/zendu/p/4988194.html
Copyright © 2011-2022 走看看