6、shell watch_dog
#! /bin/sh PRO_NAME=./gb28181-media-server while true ; do #用ps获取$PRO_NAME进程数量 NUM=`ps aux | grep -w ${PRO_NAME} | grep -v grep |wc -l` #echo $NUM #少于1,重启进程 if [ "${NUM}" -lt "1" ];then echo "${PRO_NAME} is none" ${PRO_NAME} -d #大于1,杀掉所有进程,重启 elif [ "${NUM}" -gt "1" ];then echo "more than 1 ${PRO_NAME},killall ${PRO_NAME}" killall -9 $PRO_NAME ${PRO_NAME} -d fi #kill僵尸进程 NUM_STAT=`ps aux | grep -w ${PRO_NAME} | grep T | grep -v grep | wc -l` if [ "${NUM_STAT}" -gt "0" ];then killall -9 ${PRO_NAME} ${PRO_NAME} -d fi sleep 5s done exit 0
5、内存监控工具
#free -h >> mem.log #free -h | sed -n '2p;2q' >> mem.log while true do sed -n '/1.9G>/p' mem.log | sed '$d' | sed -n '$p' | awk '{print $1,$2,$3,$4,$5,$6,$7}' if ($4 < 80 ) ; then echo "memory space is less than " >> log.txt fi #sed -n '/...>/p' mem.log | sed '$d' | sed -n '$p' | awk '{print $1,$2,$3,$4}' sleep 1 done
mem.log
Mem: 1.9G 1.3G 610M 2.3M 52M 99M Mem: 1.9G 1.3G 609M 2.3M 52M 99M Mem: 1.9G 1.3G 609M 2.3M 52M 99M Mem: 1.9G 1.3G 609M 2.3M 52M 99M
4、shell与c交互
1) shell给c传参数就用popen
FILE* fn = popen("exec_name","r");
用fgets或者fgetc来取得"exec_name"的输出~~
具体这些函数使用方法,建议楼主自己去 Unix下面 man一下。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <strings.h> #include <string.h> char* shellcmd(char* cmd, char* buff, int size) { char temp[256]; FILE* fp = NULL; int offset = 0; int len; fp = popen(cmd, "r"); if(fp == NULL) { return NULL; } while(fgets(temp, sizeof(temp), fp) != NULL) { len = strlen(temp); if(offset + len < size) { strcpy(buff+offset, temp); offset += len; } else { buff[offset] = 0; break; } } if(fp != NULL) { pclose(fp); } return buff; } int main(void) { char buff[1024]; memset(buff, 0, sizeof(buff)); printf("%s", shellcmd("ls", buff, sizeof(buff))); return 0; } /* system("ls>result.txt") FILE *fp = fopen(result, "r") */
2) 将c的变量传入shell就更简单了,有6个exec函数,都可以传参数~~
或者就直接创建一个char*用system执行好了。
3、shell中脚本参数传递的两种方式
https://blog.csdn.net/sinat_36521655/article/details/79296181
2、结束shell自身
1) 如果是shell自身的结束,可以使用exit
2) 如果是要结束shell进程。可以ps -aux | grep 获取shell脚本的进程,执行
kill -9 pid
1、shell 变量自加
declare -i iv=$svnv
let iv+=1
shell中变量自增的实现方法
Linux Shell中写循环时,常常要用到变量的自增,现在总结一下整型变量自增的方法。
我所知道的,bash中,目前有五种方法:
1. i=`expr $i + 1`;
2. let i+=1;
3. ((i++));
4. i=$[$i+1];
5. i=$(( $i + 1 ))
可以实践一下,简单的实例如下:
#!/bin/bash
i=0;
while [ $i -lt 4 ];
do
echo $i;
i=`expr $i + 1`;
# let i+=1;
# ((i++));
# i=$[$i+1];
# i=$(( $i + 1 ))
done
另外,对于固定次数的循环,可以通过seq命令来实现,就不需要变量的自增了;实例如下:
#!/bin/bash
for j in $(seq 1 5)
do
echo $j
done