• shell


    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

  • 相关阅读:
    设计模式(十八)备忘录模式
    六种常见的系统架构
    设计模式(十七)中介者模式
    设计模式(十六)观察者模式
    设计模式(十五)迭代器模式
    js实现对象深拷贝
    js中for in与for of使用
    在使用一些UI框架的某些组件的时候,,取消事件冒泡
    js开根号,使用二分法迭代
    js逆向递归 一个多维数组根据子节点ID查找所有父节点ID
  • 原文地址:https://www.cnblogs.com/dong1/p/9528041.html
Copyright © 2020-2023  润新知