一、脚本样例
以quectel的EC20模组关闭ppp拨号服务脚本为例,以下为脚本源码:
#!/bin/sh
timeout=5
killall -15 pppd
sleep 1
killall -0 pppd
while [ $? -eq 0 ]
dotimeout=`expr $timeout - 1`if [ $timeout -eq 0 ]thenexit 1fisleep 1killall -0 pppd
doneif [ $? -ne 0 ]
thenkillall -9 pppd
fi
二、代码解释
kill 后跟pid来结束进程; killall 后跟服务名称/进程名称来结束进程。
kill/killall后边跟的数字含义见下图
killall -15 pppd : 给pppd进程发送SIGTERM信号,通知该进程自己实现退出,但该程序可能在执行IO,不一定能及时响应,因此有可能被阻塞。
sleep 1: 延时1s,等待pppd自我实现退出,此时不一定能成功。
killall -0 pppd : 发送-0 的含义是判断当前进程或服务是否存在, 该进程或服务不作任何响应,如果返回0则服务存在,否则服务不存在。
while [ $? -eq 0 ] : shell 脚本的while循环控制,$?表示上一条语句执行结果。
exit 1: 退出while,并返回while的执行结果为1,一般表明异常退出,此处的含义为5秒内pppd没有正常退出。
if [ $? -ne 0 ]:判断while执行的结果,如果不为0,则执行if内容;
killall -9 pppd:发送SIGKILL信号给pppd,无条件退出,强制退出进程,该信号不可忽略或被进程捕获。