linux程序运行浅析

  例如有一个脚本文件tests.sh,内容如下:  

 1 #!/bin/bash
 2 #This is a sample test.
 3
 4 cd /tmp
 5 echo "Hello, this is a test sample!"

  在Linux上执行脚本程序有三种方法:

  1、将脚本加上可执行权限,直接执行对应的脚本文件

    chmod +x tests.sh

    ./tests.sh

  2、使用shell程序直接解析

    sh tests.sh

  3、使用source命令直接执行脚本命令

    source tests.sh

  但是真正操作之后,就很容易发现,执行的结果,只有第三种方法是完全执行了,而前两种没有切换目录。

  主要是因为,这三种执行文件的方式的思路是不同,区别如下:

  第一种方式:

  1、当命令行 shell 执行程序时,首先判断是否该程序具有可执行权限。如果没有可执行权限,就会提示:Permission denied(权限不够),因此,必须加入加上执行权限的环节;

  2、判断具有可执行权限后,则调用 Linux 内核命令新建一个进程,在新建的进程中调用指定的命令,test.sh 不是编译型的文件,所以 linux 内核并不能知道如何执行文件;

  3、然后交给 shell,shell 就知道这是一个脚本,就会启动一个新的 shell 进程来进行执行。但是 linux 系统有很多 shell,通过代码的第一行#!/bin/bash确定使用bash;

  4、命令行就启用一个新的 bash 进程来执行脚本程序;

  第二种方式:

  1、通过sh命令直接会启动一个新的 shell 进程来进行执行。但是 linux 系统有很多 shell,通过代码的第一行#!/bin/bash确定使用bash;

  2、命令行就启用一个新的 bash 进程来执行脚本程序;

  两种方式的共同点是:  

  1、父进程shell接收到命令,发现不是内建命令,创建了一个和自己一样的 s h e l l 进程,来执行这个外部命令;

  2、此时 s h e l l 子进程用/bin/sh 取代自己,sh子 进程设置自己的运行环境变量,其中包括了$PWD 变量;

  3、sh 子进程依次执行内建命令cd 和echo命令,在这个过程中,sh子进程的环境变量$PWD被改变,子进程执行完毕,就消亡了; 

  4、父进程醒来获取系统资源,恢复自己的环境变量$PWD,继续接受用户输入;

  很自然的就会明白前两种方法执行结果与预期不一样的原因了,由于父进程的当前目录(环境变量$PWD)没有也无法被子进程改变,导致没有切换目录的动作和结果。

  第三种方式:

  1、使用 source 执行 shell 脚本时不会创建子进程;

  2、直接在当前进程中直接执行shell脚本;

  3、直接对环境变量($PWD)予以更改,导致目录修改动作生效,切换到tmp目录中。

  至此,三种执行脚本的方式解析结束,希望对阅读者有所帮助。

时间: 2024-10-14 11:04:14

linux程序运行浅析的相关文章

[转载] linux 程序运行过程中替换文件

今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”.结果朋友发来一个执行结果:(test正在运行中)# cp test2 test cp: cannot create regular file `test': Text file busy 看起来是程序被占用,无法覆盖.于是自己又再做了几个实验: (1)先rm删除正在运行的test,然后cp test2 test就没有错误了.(2)先mv改名正在运行的test,

linux 程序运行监控

一 . 使用supervise 是daemon-tools 的一个功能,系统的守护进程.在进程挂掉的时候可以自动重启. 二   安装 wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz tar zxvf *.tar.gz && cd daemon/package   这里代码修改下代码,sed -i 's/extern int errno;/#include <errno.h>/1' ./src/error.h, i

如何实现在Windows上运行Linux程序,附示例代码

如何实现在Windows上运行Linux程序,附示例代码 微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理,而今天的这篇文章将会讲解如何自己实现一个简单的原生Linux程序运行器, 这个运行器在用户层实现, 原理和Bash On Windows不完全一样,比较接近Linux上的Wine. 示例程序完整的代码在github上, 地址是 https://github.com/30324

【转】使程序在Linux下后台运行 (关掉终端继续让程序运行的方法)

一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关机不影响日本那边的程序运行.(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼) 2:不影响计算效率 2:让程序在后台跑后,不会占据终端,我们可以用终端做别的事情. 二.怎么样使程序在后台执行 方法有很多,这里主要列举两种.假如我们有程序pso

【Java】Java程序打包成jar包在Linux上运行

当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行. 1.Java程序用MyEclipse打包成可运行的jar包 (1)在MyEclipse中选中需要打包的项目,点击右键,选择:Export... 如下图所示: (2)然后在弹出的窗口中选择:Java-->Runnable JAR file,然后点击:Next,如下图所示: (3)然后选择需要打包的程序和保存的地方,然后点击:Finish,如下图所示: 这样Java程序

图文浅析APK程序运行的过程

概述 APK程序运行过程有别于FrameWork底层启动过程,它们是倆码事,本文将以图文方式总结一下APK启动的过程,主要分为一下部分 [1]基本概念 [2]APK过程 1 .新的知识点 [1]什么是UI线程与Thread线程区别 UI线程并不陌生,但是这玩意到底是啥,与普通线程Thread有啥区别呢? 什么是UI线程: ActivityTread类所在的线程即为UI线程,负责用户交互,处理用户消息绘制界面等 区别: UI线程的ActivityTread中的Main方法已经使用Looper.pr

在Linux中运行Nancy应用程序

最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一个自托管(Self-host)的应用程序,并且将其发布到Linux系统中. 什么是NancyFx? 简单地说,这真是一个神奇的框架.它给自己的定义是:lightweigh web framework for .NET.不用不知道,一用吓一跳哈 http://nancyfx.org/ 与微软官方的AS

linux后台运行程序(secureCRT断掉或关闭后继续运行程序)

secureCRT断掉后想继续运行程序.也就是程序会在后台一直执行到结束. secureCRT通过ssh联接到client端运行程序,如果关掉窗口或者断开连接时,任务会被kill. 为了程序能够后台执行到结束: 1.可以用&: 比如 python test.py 改成 python test.py & 来调用执行. 2.另外,还有一种方式:通过ctrl+z.bg等一系列的命令,将已经在前台运行的作业放到后台执行: 如果一个作业已经在前台执行,可以通过ctrl+z将该作业放到后台并挂起.然后

如何让linux程序在ssh shell关闭后继续运行?

我们经常会碰到一种情况,用ssh远程登录到linux服务器后,启动一个脚本跑任务,如果这个任务耗时比较久,就得等着,如果此时由于网络原因,ssh连接断了,再重新登录服务器,原来的任务就没了,得重新运行一次.有没有办法让任务切到后台,ssh退出后还能继续运行呢? 当然有-,而且很简单: 1. 在ssh shell中运行脚本,比如我运行一个批量下载脚本: python download-app-annie.py 2. 按下ctrl-z中断脚本运行,此时系统提示: ^Z [1]+  Stopped