Linux上编辑然后执行一段脚本的机制

简要分析下刚开始提出的第二个问题, 因为没看代码,所以只是简单流程

1. 在bash里打开vim编辑文件并保存退出:

bash进程fork子进程, 然后调用exec装入vim程序,wait这个子进程
vim进程打开文件: fd = open系统调用
用户输入:- io中断 - 字符显示 - 存入缓冲区
保存: 缓冲区数据 write系统调用写入文件
退出: 关闭fd,退出vim进程
回到bash进程

2. bash中执行shell脚本, 如执行下面的脚本文件my.sh:

#!/bin/sh
cd .
ps -o pid,pgid,ppid,sid,tty,comm

流程:
bash进程fork子进程+调用exec执行脚本,并且wait这个子进程结束;
内核检查脚本第一行是否指定了解释器(如#!/bin/sh), 如果有,子进程会装入sh解释器程序,相当于运行/bin/sh my.sh
这个sh进程从内存中读取脚本命令:
    如果是内建命令(如cd),解释器会调用相关函数执行;
    如果是外部命令(如ps),sh进程fork子进程+调用exec装入ps程序执行,并且等待ps进程结束。
ps进程打印输出,进程结束,回到sh进程
sh执行完毕,进程结束,回到bash进程
bash进程继续执行,打印提示符等待输入

脚本执行结果:

$ ./my.sh
PID PGID PPID SID TT COMMAND
2162 2162 2161 2162 pts/11 bash
3030 3030 2162 2162 pts/11 my.sh
3031 3030 3030 2162 pts/11 ps

可以看出(PPID),ps parent进程是my.sh, my.sh parent是bash.  my.sh和ps进程属于一个进程组(PGID)

时间: 2024-11-05 14:42:01

Linux上编辑然后执行一段脚本的机制的相关文章

在Windows下生成的shell文件在上传到Linux上发现无法执行

为了批量生成shell文件,我在Windows下用knime循环生成一批shell文件,在上传到Linux上执行时发现报错: [[email protected] Stock]$ ./f_wdt_outsource_outbound_header.sh -bash: ./f_wdt_outsource_outbound_header.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录 [[email protected] Stock]$ 在将shell文件内的代码完全复制到一个新建的

linux上Kettle定时执行(转换的单步执行,job的单步执行,环境变量,kettle定时功能,效率问题等)转自(http://blog.csdn.net/feng19821209/article/details/5800960)

1,Kettle跨平台使用.    例如:在AIX下(AIX是IBM商用UNIX操作系统,此处在LINUX/UNIX同样适用),运行Kettle的相关步骤如下:    1)进入到Kettle部署的路径    2)执行 chmod *.sh,将所有shell文件添加可执行权限    3)在Kettle路径下,如果要执行transformation,就运行./pan.sh -file=?.ktr -debug=debug -log=log.log    其中.-file说明你要运行的transfor

go在Linux上编译Windows执行文件

参考:http://studygolang.com/topics/21 (1)首先进入go/src 源码所在目录,执行如下命令创建目标平台所需的包和工具文件. $ cd /usr/local/go/src$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 如果是 Windows 则修改 GOOS 即可.$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash-------------------

【Jmeter基础】 Linux上运行Jmeter

Jmeter 是一个强大的并发压测工具,常用于性能测试,压力测试,接口测试等领域.本文将介绍如下内容: 1. Jmeter 执行阶梯式压测 2. Jmeter 如何压测网站的js,css 等资源 3. 在Linux 系统上如何执行Jmeter压测 一.使用Jmeter执行阶梯式压测 启动jmeter,添加线程组——[email protected] - Stepping Thread Group,如下图: Stepping Thread Group界面如下: 功能如下: This group w

Windows编写的shell脚本,在linux上无法执行

前两天由于要查一个数据库的binlog日志,经常用命令写比较麻烦,想着写一个简单的脚本,自动去刷一下数据库的binlog日志,就直接在windows上面写了,然后拷贝到linux中去运行,其实很简单的脚本,具体如下: #!/bin/bash #flush mysql logs every day BASEDIR="/usr/local/mysql" echo $BASEDIR BIN="$BASEDIR/bin" echo $BIN MYSQL="$BIN

[转]Linux上程序执行的入口--Main

main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么?这次我们来探讨一下这个问题. 1. main()函数的形式先来说说main函数的定义,较早开始写C程序的肯定都用过这样的定义void main(){},其实翻翻C/C++标准,从来没有定义过void main().在C标准中main的定义只有两种:        int main(void)   

Linux下设置定期执行脚本

下面针对的是非ubuntu环境,会在文章末尾介绍ubuntu的一些区别. 在Linux下,经常需要定期的执行一些脚本从而来实现一些功能. 在Linux下我们用crontab来实现定期的执行脚本这个功能,下面就介绍一下crontab的使用.以及我遇到的一些问题 一. crontab的使用说明 1. crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此任务调度命令.crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作.而linux任

Linux上程序执行的入口--Main

main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么?这次我们来探讨一下这个问题. 1. main()函数的形式先来说说main函数的定义,较早开始写C程序的肯定都用过这样的定义void main(){},其实翻翻C/C++标准,从来没有定义过void main().在C标准中main的定义只有两种:        int main(void)   

linux上应用程序的执行机制

linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信息. 1.父进程的行为: 复制,等待 执行应用程序的方式有很多,从shell中执行是一种常见的情况.交互式shell是一个进 程(所有的进程都由pid号为1的init进程fork得到,关于这个话题涉及到Linux启动和初 始化,以及idle进程等,有空再说),当在用户在shell中敲入./test执行程序时,