自学Linux Shell5.1-深入理解shell父子关系
这些子进程可以是由Shell脚本直接启动的,让我们看一下如何在Shell脚本中启动一个新进程。表示当前正在执行此脚本文件的进程ID号”并且这个子进程将会从当前执行点开始执行。
在学习Linux Shell编程的过程中,我们经常会遇到父子进程的概念。Shell脚本是由Shell解释器来执行的,而Shell解释器本身也是一个进程。当我们在执行一个Shell脚本时,会产生若干个子进程。这些子进程可以是由Shell脚本直接启动的,也可以是由其他命令启动的。
那么,在这些父子关系中,它们之间到底存在着怎样的联系呢?又有哪些需要注意和掌握的技巧呢?下面我们将通过实例来深入理解shell父子关系。
首先,让我们看一下如何在Shell脚本中启动一个新进程。以下为示例代码:
“`
#!/bin/sh
echo “Before fork()”
echo “PID=$$”
fork()
if [ $? -eq 0 ]
then
echo “In child process”
echo “PID=$$”
else
echo “In parent process”
fi
在这段代码中,“$$”表示当前正在执行此脚本文件的进程ID号。
当运行以上代码后,在终端上输出结果为:
Before fork()
PID=1234
In parent process
In child process
PID=5678
可以看出,在调用fork()函数之前,输出的信息只有一条。而在调用fork()函数之后,输出了两条信息。这是因为,在调用fork()函数时,会创建一个新的子进程,并且这个子进程将会从当前执行点开始执行。
同时,在父进程中也会返回一个值,可以通过$?来获取。如果返回值为0,则表示当前处于子进程中;反之则表示当前处于父进程中。
接下来,我们再看一下如何使用Shell脚本启动另一个命令,并获取它的PID号。
以下为示例代码:
echo “Before command”
command &
echo “After command”
在这段代码中,“&”符号表示启动该命令时不等待其执行结果即可返回终端提示符。
Before command
After command
[1] 12345
其中,“[1]”代表该命令是第一个被启动的后台任务;“12345”则是该任务所对应的PID号。
最后,我们再来看一下如何使用Shell脚本向正在执行的命令发送信号。以下为示例代码:
pid=$!
echo “PID=$pid”
sleep 5s
kill -9 $pid
在这段代码中,“$!”代表最近一次被启动的后台任务所对应的PID号。“-9”则代表强制杀死该任务。
PID=12345
可以看出,我们成功向正在执行的命令发送了信号,并将其杀死。
总结一下,Shell脚本中的父子进程关系是非常重要和常用的概念。掌握了这些技巧,可以让我们在编写Shell脚本时更加灵活、高效地运用系统资源。