so谷歌了一下,写了一个脚本每30s判定一下进程是否存在,如不存在就自动拉起来。 #!.../logs/stderr.log 1>> /dev/null; else sleep 30; echo "process
这是一个有趣的现象,catalina.sh start方式启动的tomcat会把java进程挂到init(进程id为1)的父进程下,已经与当前test.sh进程脱离了父子关系,也与ssh进程没有关系,为什么关闭...我们的推测是ssh窗口在关闭时,对当前交互的shell以及正在运行的test.sh等子进程发送某个退出的Signal,找了一台装有systemtap的机器来验证,所用的stap脚本是从涧泉同学那里copy.../bin/sh sleep 4400 & echo "shell exit" 运行a.sh脚本之后,sleep 4400进程的pid与pgid是不同的,pgid是其父进程的id,即已经退出了的a.sh...交互模式与非交互模式对作业控制(job control)默认方式不同 为什么在交互模式下shell不会对后台进程处理SIGINT信号设置为忽略,而非交互模式下会设置为忽略呢?...因为默认如果采用父进程的进程组ID,父进程会把收到的键盘事件比如ctrl-c之类的SIGINT传播给进程组中的每个成员,假设后台进程也是父进程组的成员,因为作业控制的需要不能忽略SIGINT,你在终端随意
提示:以下是介绍为什么写这篇文章: 如何再shell脚本中调用其他脚本? 顺序调用会保证脚本的顺序执行吗?...运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。...echo -e "In 2.sh: variable A=$A\n" 注:这两个脚本中的参数 用于返回脚本的 PID , 也就是进程 ID。...fork方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值,可以看出,两个脚本是分成两个进程运行的。...运行顺序为1-2。从pid值看,两者是在同一进程中运行的。
子Shell的本质可以理解为Shell的子进程,子进程的概念是由父进程的概念引申而来的,在Linux系统中,系统运行的应用程序几乎都是从init(pid为1的进程)进程派生而来的,所有这些应用程序都可以视为...Shell脚本是从上至下、从左至右依次执行每一行的命令及语句的,即执行完一个命令之后再执行下一个。...如果在Shell脚本中遇到子脚本(即脚本嵌套),就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句。...子shell的分类 大致分为两类: sub shell:通过进程替换(cmd)、命令替换 child shell:通过以可执行文件的方式运行shell脚本或直接在当前shell中启动shell...注释:使用 fork() 函数可以创建一个子进程;除了 PID(进程ID)等极少的参数不同外,子进程的一切都来自父进程,包括代码、数据、堆栈、打开的文件等,就连代码的执行位置(状态)都是一样的。
运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。...echo -e "In 2.sh: variable A=$A\n" 注:这两个脚本中的参数 $$ 用于返回脚本的 PID , 也就是进程 ID。...fork fork 方式可以看出,两个脚本都执行了,运行顺序为1-2-1,从两者的PID值(1.sh PID=82266, 2.sh PID=82267),可以看出,两个脚本是分成两个进程运行的。...exec exec 方式运行的结果是,2.sh 执行完成后,不再回到 1.sh。运行顺序为 1-2。从pid值看,两者是在同一进程 PID=82287 中运行的。 source ?...source source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。
生命周期: 守护进程会长时间运行,常常在系统启动时就开始运行,直到系统关闭时才终止。 守护进程不依赖于终端 从终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端。...; • 终端进程组ID为-1(TPGID表示终端进程组ID,该值表示与控制终端相关的前台进程组,如果未和任何终端相关,其值为-1; • 所有的守护进程的父进程: 历史上,Linux 的启动一直采用init...当在shell里运行一行命令后(不带&)创建一个新的进程组,命令行中如果有多个命令会创建多个进程,这些进程都处于该新建进程组中,shell将该新建的进程组设置为前台进程组并将自己暂时设置为后台进程组。...关闭文件描述符 复制代码 1.创建子进程,父进程退出 由于守护进程是脱离控制终端的,因此,完成第一步后就会在shell终端里造成一程序已经运行完毕的假象。.../run 的UID为0; • 没有控制终端(TTY为?); • 终端进程组ID为-1; • 守护进程的父进程为1516,即systemd。 作者:一口Linux
main函数返回给谁 01函数为什么需要返回值 函数在设计的时候设计了参数和返回值,参数是函数的输入,返回值是函数的输出。 因为函数需要对外输出数据(实际上是函数运行的一些结果值),因此需要返回值。...03Linux下一个程序执行的本质 (1)表面来看,Linux中在命令行中去./xx去执行一个可执行程序。 (2)我们可以通过shell脚本来调用执行一个程序(下面会写一个shell脚本)。...return 0; } 然后我再创建一个shell脚本: shell脚本里面的内容为: #!...执行结果为: 说明:Linux shell中用$?这个符号来存储和表示上一个程序执行结果(这里就是./a.out)。#!/bin/sh这个书写shell脚本的格式。...03为什么要给main函数传参 (1)首先,main函数不传参是可以的,也就是说父进程调用子进程并且给子进程传参不是必须的;int main(void)这种形式就是不要传参了。
即允许在内存中存储数据,使得在程序或shell中运行的脚本能够访问它们。...该进程创建的子shell无法读取父shell的局部变量。 [root@dev shell]# sh a.sh 2 22 2 [root@dev shell]# cat a.sh #!...一个使用场景是:多个执行脚本依赖于共同的环境配置,这个配置写在一个env.sh脚本里,如何使其他执行脚本可以读取到env.sh里变量?在子shell中export变量,并不能影响到父shell。...source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。...这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。
---- ---- 这个问题涉及了三个知识点: 变量(环境变量、自定义变量) 父进程与子进程 脚本的执行方式 什么是变量?变量的分类? 1. 环境变量 全局变量,可被子进程继承 2....子进程仅继承父进程的环境变量,子进程不会继承父进程的自定义变量 可使用如下命令将自定义变量转换为环境变量: export 变量名称 为什么父进程的环境变量数据可被子进程引用?...此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。...如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell(子shell)中被使用,...sh执行脚本时,linux将创建子shell进程进行脚本执行,脚本执行结束后,在当前shell(父进程)必然无法查看已经消失的子进程的环境变量。
/test.sh & 查看当前shell环境中已启动的任务情况:jobs 将test.sh切换到前台运行:fg %number(”number”为使用jobs命令查看到的 [ ] 中的数字,不是pid...这是因为以上两种方法使得test.sh在后台运行时,运行test.sh进程的父进程是当前shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,子进程收到hangup...test.sh脚本进程 退出当前shell终端,再重新打开,使用jobs看不到正在运行的test.sh,但使用ps -ef可以看到 在后台不中断的运行test.sh,可以使用nohup忽略hangup...信号,或者使用setsid将其父进程改为init进程(进程号为1) 不中断的在后台运行test.sh另一个命令:setsid ..../test.sh & 使用ps -ef |grep test.sh可看到test.sh进程的父进程id为1 测试脚本 !
tomcat启动之后,当前shell进程并没有退出,而是挂住在tail进程,往终端输出日志内容。这种情况下: 1)、如果我先直接关掉ssh窗口后,Java进程会退出,服务不可用。...这是一个有趣的现象,catalina.sh start方式启动的tomcat会把java进程挂到init(进程id为1)的父进程下,已经与当前test.sh进程脱离了父子关系,也与ssh进程没有关系,为什么关闭...交互模式与非交互模式对作业控制(job control)默认方式不同: I)在交互模式下,因为作业控制的需要,shell不会对后台进程处理SIGINT信号设置为忽略。...因此,在交互模式下的后台进程会设置一个自己的进程组ID。...不开启作业控制的话,脚本里的后台进程可以通过设置忽略SIGINT信号来避免父进程对组中成员的传播,因为对它来说这个信号已经没有意义。
/test.sh & 查看当前shell环境中已启动的任务情况:jobs 将test.sh切换到前台运行:fg %number(”number”为使用jobs命令查看到的 [ ] 中的数字,不是pid)...中断后台运行的test.sh脚本:先fg %number切换到前台,再ctrl+c;或是直接kill %number 以上两种在后台运行test.sh的方法,当遇到退出当前shell终端时,后台运行的...不中断后台运行脚本 这是因为以上两种方法使得test.sh在后台运行时,运行test.sh进程的父进程是当前shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,...test.sh脚本进程 退出当前shell终端,再重新打开,使用jobs看不到正在运行的test.sh,但使用ps -ef可以看到 在后台不中断的运行test.sh,可以使用nohup忽略hangup信号.../test.sh & 使用ps -ef |grep test.sh可看到test.sh进程的父进程id为1 测试脚本 #!
一个由冒号分隔的目录列表,shell用它来搜索命令,一个普通值为 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/usr/bin PPID:父进程的进程ID PS1:主提示符串...HOME和MAIL由login(1)设置 SHELLOPTS:包含一列开启的shell选项,比如braceexpand、hashall、monitor等 UID:展开为当前用户的用户ID,在shell启动时初始化...从报错信息可以发现shell并没有识别这是个赋值语句,而是把Barry=hello当作一个命令来执行,当然会报错。 为什么不能识别这是赋值语句呢?...5.特殊变量 $0:当前脚本的文件名 $num:num为从1开始的数字,$1是第一个参数,$2是第二个参数,${10}是第十个参数 $#:传入脚本的参数的个数 $*:所有的位置参数(作为单个字符串)...:后台运行的最后一个进程的pid $-:显示shell使用的当前选项 $_:之前命令的最后一个参数
检测思路: 检测 root 进程,查看父进程。...如果父进程为低权限用户,通过 /proc/id/environ 查看环境信息是否有 SUDO_COMMAND\SUDO_USER\SUDO_UID 这三个变量。...方案一: 通过 audit 日志检测 uid 和 euid 判断父进程是否为低权限用户,提出 pid 找出对应环境变量。看下是否上面的三个变量。...=2) print 2, ps -u root ae 可以看到环境变量 1、查出高权限的父进程为低权限 ps -u root ex -f | awk '{if (3!...原始的 sshd 监听端口建立了 tcp 连接后,会 fork 一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的 /usr/sbin/sshd,这样子控制权又回到脚本了。
请不要在此纠结子 bash 和子 shell,如果搞不清楚他们的关系,就当他们是同一种东西好了。 那是否可以理解为所有命令、脚本其运行环境都是在子shell中呢?...从bash是内置命令的角度来考虑,它不会进入子shell,这一点在执行bash命令后从变量$BASH_SUBSHELL的值为0可以验证出来。...事实也确实如此,shell脚本只会继承父shell的一项属性:父进程所存储的各命令的路径。另外,执行shell脚本有一个动作:命令执行完毕后自动退出子shell。...最后需要说明的是,子shell的环境设置不会粘滞到父shell环境,也就是说子shell的变量等不会影响父shell。 还有两种特殊的脚本调用方式:exec和source。...它也不会开启子shell,直接在当前shell中执行调用脚本且执行脚本后不退出当前shell,所以脚本会继承当前已有的变量,且脚本执行完毕后加载的环境变量会粘滞给当前shell,在当前shell生效。
总结过程如下: 按照grub.conf中"root="的指定安装根文件系统 内核执行/sbin/init程序 由于init是Linux内核执行的第一个程序,因此它的进程ID(PID)为1....init进程起来后,系统启动的控制权移交给init进程, /sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作: 执行系统初始化脚本.../sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,判断运行级别。.../etc/rc.d/init.d/中的脚本是守护进程。守护进程是在后台运行并提供某种服务的进程。例如,http守护进程(httpd)提供Web服务。...当shell脚本运行时,通常会出现非交互式shell。它是非交互式的,因为它正在处理脚本而不是等待命令之间的用户输入。对于这些shell调用,仅使用从父shell继承的环境。
另外,为什么 fork 给父进程返回子进程的 pid,而给子进程返回0呢?...2、进程退出的情况 进程退出时一共有如下三种情景: 代码运行完毕且结果正确 – 此时退出码为0; 代码运行完毕且结果不正确 – 此时退出码为非0; 代码异常终止 – 此时退出码无意义。..., status); } return 0; } 我们可以通过一个监控脚本来检测子进程从创建到终止到被父进程回收的过程: while :; do ps axj | head -1 &&...,我们就可以自己实现一个简易的 shell 命令行解释器了;实现一个简易的 shell 大概可以分为如下几步: 输出提示符; 从终端获取命令行输入; 解析命令行输入信息; 创建子进程...,而是由 shell 进程本身内部的逻辑来完成;外部命令则是通过创建子进程,然后进行进程程序替换,运行外部程序文件等方式来完成。
为了区分每一个运行的程序,Linux给每个进程都做了标识,称为进程号(process ID),每个进程的进程号是唯一的。...使用PID区分不同的进程 系统启动后的第一个进程是init,它的PID是1。init是唯一一个由系统内核直接运行的进程。...除了init之外,每个进程都有父进程(PPID标识) 每个进程还有四个与用户和组相关的识别号 实际用户识别号 (real user ID,RUID) 实际组识别号 (real group...运行后台进程的方法是在命令行最后加上 “&” 进程和作业的区别: 进程:操作系统的概念,由操作系统负责管理 作业:shell程序的概念,由shell程序负责管理 一个操作系统可以启动多个shell程序,...atd服务只是从myatXX文件中读取内容,真正执行的命令会存放在另外一个文件,我们用at -c命令可以看到这个真正执行文件内容。 脚本放在哪个目录下?脚本需要添加可执行属性吗?
领取专属 10元无门槛券
手把手带您无忧上云