嵌入式linux应用开发之常用shell脚本总结(下)

简介: 嵌入式linux应用开发之常用shell脚本总结

简化常用指令操作,写个脚本


比如设置环境变量和scp往机器中拷贝文件,整个脚本简化下操作,省得重复敲不少命令


#!/bin/bash
source /opt/myir-imx-fb-qt5/4.1.15-2.0.1/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
scp myapp root@192.168.79.1:/app/my_app/bin


或者是启动应用,手动执行可能还得进入某个目录或设置环境变量,写一个脚本搞定:


run_app.sh


#!/bin/bash
export LD_LIBRARY_PATH=/app/city_app/lib/
echo $LD_LIBRARY_PATH
cd /app/city_app/bin/
./b503_app


查找应用并设置应用的环境变量并运行


run_app.sh


应用升级脚本


start_remoteupdate.sh


#!/bin/bash
singelName="remoteupdate"
fileName="/usr/bin/remoteupdate"
configFile="/app/update.conf"
function CheckProcess()
{
  PROCESS_NUM=`ps | grep "$1" | grep -v "grep" | wc -l`
  return $PROCESS_NUM
}
function startProcess()
{
  echo "check process run status"
  CheckProcess $singelName
  if [ $? -eq 0 ];then
    echo "progress is not run"
  else
    echo "process is running"
    #killall -9 $singelName
    #sleep 1
    exit 0
  fi 
  echo "start remoteupdate ..."
  $singelName &
  echo "start end"
}
#copy config file
if [ -f $configFile ];then
  echo "config file exist"
else
  echo "copy update.conf file"
  cp /app/city_app/opt/update.conf /app/
  sync
  if [ -f $configFile ];then
    echo "copy ok"
  fi
fi
#start process remoteupdate
if [ ! -f $fileName ];then
  echo "copy remoteupdate process to /usr/bin"
  cp /app/city_app/opt/$singelName /usr/bin/
  sync
  if [ -f $fileName ];then
    echo "copy ok"
    startProcess
    exit 0
  else
    echo "copy fail"
    exit 1
  fi
else
  echo "remoteupdate file exsit"
  startProcess
  exit 0
fi


应用监控和升级服务脚本


app_monitor.sh


#!/bin/bash
#######city app monitor deamon ########
function checkAppRun()
{
   flag=0
   val=0
   cnt=0
   max=$2
   #echo "checkApprun...$1"
   while [ $val -lt $max ]
   do           
      cnt=$(ps | grep $1 | wc -l)          
      if [ $cnt -le 1 ];
      then
         let flag+=1
         sleep 1
         let val+=1
      else
          break
      fi
   done  
   if [ $flag -ge $max ];
   then
      return 0
   #$1 app is not running
   else 
      return 1   
   #$1 app has been run
   fi
}
function CheckProcess()
{
  PROCESS_NUM=`ps | grep "$1" | grep -v "grep" | wc -l`
  return $PROCESS_NUM
}
function monitor_app()
{
   while true
   do
       CheckProcess b503_app
       if [ $? -ne 1 ] ;
       then 
            if [ $? -ne 0 ];
      then
          killall -9 b503_app
      fi
            source /etc/init.d/app_update_b503_app.sh
       fi
#       CheckProcess remoteupdate
#       if [ $? -ne 1 ] ;
#       then
#            if [ $? -ne 0 ];
#            then
#                killall -9 remoteupdate
#            fi
#            source /etc/init.d/app_start_remoteupdate.sh
#       fi
   done
}
function monitor_b503_ft()
{
   while true
   do
       CheckProcess b503_ft
       if [ $? -eq 0 ] ;
       then
      break
       else 
      sleep 1
       fi
   done
}
function monitor_ft_app()
{
   while true
   do
   checkAppRun b503_ft 2
   if [ $? -eq 0 ] ;
   then  
      break
   fi
   done
}
################main#####################
####synchronize date and rtc time####### 
#date 
#hwclock -w --local
########################################
source /etc/init.d/app_update_b503_ft.sh
#monitor_ft_app &
checkAppRun b503_ft 2
if [ $? -eq 0 ] ;
then
    source /etc/init.d/app_update_b503_app.sh
    monitor_app &
else
    monitor_b503_ft 
    source /etc/init.d/app_update_b503_app.sh
    monitor_app &
fi


应用ipk包安装脚本


#!/bin/bash
#b503 application update mechnism
#search directory in order, /update,/media/usb/
#set -e
buzzGPIO="/sys/class/gpio/gpio15"
curdir=$(pwd)
#b503_city_app_name=city_app
#enable buzzse for notifying success
function beep_notify()
{
   if [ ! -d "$buzzGPIO" ]; then
        echo 15 > /sys/class/gpio/export
   fi
   if [ -d "$buzzGPIO" ]; then
        echo "out" > "/sys/class/gpio/gpio15/direction"
        echo "1" > "/sys/class/gpio/gpio15/value"
        sleep 1
        echo "0" > "/sys/class/gpio/gpio15/value"
   fi
}
#install all ipks in specified directory
function install_ipks()
{
   path=$1
   files=$(ls $path)
   for filename in $files
   do
      if [ "${filename##*.}"x = "ipk"x ]; 
      then
          echo $filename
          cd $path
          opkg install --force-reinstall --force-downgrade --force-overwrite $filename
#         sleep 1
      fi 
   done
}
#check and create directory by specified path 
function check_and_mkdir()
{
   result_path=$1
   result_name=$2
   cd $result_path
#   echo "$result_path"
   if [ ! -d $result_name ];
   then
      #echo "mkdir $result_name"
      mkdir -p $result_name
   #else
   #   echo "$result_name is exit!!"
   fi
}
#check if updating from update directory 
function isUpdateIpkFromUpdir()
{
   #echo "1--->search update ipk directory."
   cd /update  
   #cnt=$(find -name "*.ipk" | wc -l)
   if [ -d ipk ];
   then 
      cnt=$(ls ipk | wc -l)
      if [ $cnt -ge 1 ] ;
      then  
         echo "1.1--->check update flag !"
         cnt=$(find -name "update.txt" | wc -l )
         if [ $cnt -ge 1 ];
         then 
            var=$(cat update.txt)
            if [[ $var -eq 1 ]];
            then
               echo "1.2--->update-flag is 1!" 
               return 0 
            else              
               echo "1.3--->update flag is 0" 
               return 1
            fi
         else
            echo "1.8--->no update.txt.."
            return 1
         fi      
      else
         echo "1.9--->there is no  ipk files in update directory!"
         return 1
      fi
   fi 
   return 1
}
#check if updating  bin  from update directory 
function isUpdateBinFromUpdir()
{
   #echo "1--->search update bin directory."
   cd /update  
   if [ -d bin ];
   then  
   cnt=$(ls bin | wc -l)
   if [ $cnt -ge 1 ] ;     
   then 
      cnt=$(find -name "update.txt" | wc -l )
      if [ $cnt -ge 1 ];
      then 
         var=$(cat update.txt)
         if [[ $var -eq 2 ]];
         then
            return 0 
         else              
            return 1
         fi
      else
         return 1
      fi
   fi
   fi
   return 1
}
#check if updating  lib  from update directory 
function isUpdateLibFromUpdir()
{
   #echo "1--->search update lib  directory."
   cd /update   i
   if [ -d lib ];
   then 
   cnt=$(ls lib | wc -l)
   if [ $cnt -ge 1 ] ;  
   then     
      cnt=$(find -name "update.txt" | wc -l )
      if [ $cnt -ge 1 ];
      then 
         var=$(cat update.txt)
         if [[ $var -eq 3 ]];
         then
            return 0 
         else              
            return 1
         fi
      else
         return 1
      fi    
   fi
   fi 
   return 1
}
#check if updating  audio  from update directory 
function isUpdateAudioFromUpdir()
{
   #echo "1--->search update audio directory."
   cd /update  
   if [ -d audio ];
   then 
   cnt=$(ls audio | wc -l)
   if [ $cnt -ge 1 ] ;     
   then  
      cnt=$(find -name "update.txt" | wc -l )
      if [ $cnt -ge 1 ];
      then 
         var=$(cat update.txt)
         if [[ $var -eq 4 ]];
         then
            return 0 
         else              
            return 1
         fi
      else
         return 1
      fi    
   fi
   fi
   return 1
}
#check if updating form udisk 
function isUpdateFromUdisk()
{
   #echo "2--->search u disk directory."
   cd /media
   cnt=$(find -name "usb" | wc -l )
   if [ $cnt -ge 1 ];
   then 
      cd /media/usb 
      cnt=$(find -name "*.ipk" | wc -l)
      if [ $cnt -ge 1 ] ;
      then 
         echo "2.1--->udisk,find ipk files"
         return 0
      else
         echo "2.2--->udisk,no b503-app.ipk......" 
         return 1
      fi
   else
      #echo "2.9:no udisk is inserted......."    
      return 1 
   fi
}


服务管理,启动或停止服务


service.sh


#!/usr/bin/env sh
export ALIPAY_ROOT=$(cd `dirname $0`; cd ../../; pwd)
# define the global value
pid=
start_service() {
  cd ${ALIPAY_ROOT}/iotsdk/bin
  nohup ./alipay_iotd >/dev/null 2>&1 &
}
PS_LINE=`ps |grep alipay_iotd|grep -v grep`
if [ ! -z "${PS_LINE}" ]; then
  #pids=(${PS_LINE// / })
  pid=`echo ${PS_LINE} | cut -d ' ' -f 1`
  #pid=${pids[0]}
  echo "snapshot pid is ${pid}"
fi
case $1 in
  "keepalive")
    if [ -z "${pid}" ]; then
      start_service
    fi
  ;;
  "startup")
    if [ -z "${pid}" ]; then
      start_service
    else
      echo "Service was already started!"
    fi
  ;;
  "shutdown")
    if [ -n "${pid}" ]; then
      kill -9 "${pid}"
      echo "Service was terminated!"
    fi
  ;;
  "restart")
    if [ -n "${pid}" ]; then
      echo "Stop service..."
      kill -9 "${pid}"
      echo "Service was terminated!"
    fi
    sleep 3
    start_service
  ;;
  "status")
     echo "Service is running on proc: ${pid}"
  ;;
  *)
     echo "Unsupported command!"
  ;;
esac


统一改写目录下的文件属性


#!/bin/bash
#查找当前目录下(递归级数1)的所有目录文件
SRC_DIR=$(find ./ -maxdepth 1 -type d)
#变量SRC_DIR可以用${}引用,可以$直接引用,但不可以用$()引用
echo ${SRC_DIR}
#将当前目录下所有一级目录文件的Other写属性去掉
chmod o-w ${SRC_DIR}


自动下载并构建freetype脚本


#!/bin/bash
set -x
set -o errexit -o nounset
# 22.0.16 is the libtool version of 2.9.0
if pkg-config --atleast-version 22.0.16 freetype2; then exit; fi
pushd $HOME
wget http://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.bz2
tar xf freetype-2.9.tar.bz2
pushd freetype-2.9
./autogen.sh
./configure --prefix=$HOME/.local
make -j4 install
popd
popd


首次安装脚本install.sh



#!/usr/bin/env sh
#SOURCE_DIR=`pwd`
SOURCE_DIR=/app/city_app/alipay
TARGET_DIR=/app/alipay
if [ ! -d $TARGET_DIR ]; then
    mkdir $TARGET_DIR
fi
if [ ! -d $TARGET_DIR/iotsdk ]; then
    mkdir $TARGET_DIR/iotsdk
fi
if [ ! -d $TARGET_DIR/iotsdk/bin ]; then
    mkdir $TARGET_DIR/iotsdk/bin
fi
if [ ! -d $TARGET_DIR/iotsdk/conf ]; then
    mkdir $TARGET_DIR/iotsdk/conf
fi
if [ ! -d $TARGET_DIR/runtime ]; then
    mkdir $TARGET_DIR/runtime
fi
if [ -e $SOURCE_DIR/iotsdk/bin/alipay_iotd ]; then
    cp $SOURCE_DIR/iotsdk/bin/alipay_iotd $TARGET_DIR/iotsdk/bin
fi
if [ -e $SOURCE_DIR/iotsdk/bin/alipay_iotmd ]; then
    cp $SOURCE_DIR/iotsdk/bin/alipay_iotmd $TARGET_DIR/iotsdk/bin
fi
if [ -e $SOURCE_DIR/iotsdk/bin/monitor.sh ]; then
    cp $SOURCE_DIR/iotsdk/bin/monitor.sh $TARGET_DIR/iotsdk/bin
fi
if [ -e $SOURCE_DIR/iotsdk/bin/service.sh ]; then
    cp $SOURCE_DIR/iotsdk/bin/service.sh $TARGET_DIR/iotsdk/bin
fi


autogen.sh


#!/bin/sh
# Run this to generate all the initial makefiles, etc.
test -n "$srcdir" || srcdir=`dirname "$0"`
test -n "$srcdir" || srcdir=.
olddir=`pwd`
cd $srcdir
#echo -n "checking for ragel... "
#which ragel || {
# echo "You need to install ragel... See http://www.complang.org/ragel/"
# exit 1
#}
echo -n "checking for pkg-config... "
which pkg-config || {
  echo "*** No pkg-config found, please install it ***"
  exit 1
}
echo -n "checking for libtoolize... "
which glibtoolize || which libtoolize || {
  echo "*** No libtoolize (libtool) found, please install it ***"
  exit 1
}
echo -n "checking for gtkdocize... "
if which gtkdocize ; then
  gtkdocize --copy || exit 1
else
  echo "*** No gtkdocize (gtk-doc) found, skipping documentation ***"
  echo "EXTRA_DIST = " > gtk-doc.make
fi
echo -n "checking for autoreconf... "
which autoreconf || {
  echo "*** No autoreconf (autoconf) found, please install it ***"
  exit 1
}
echo "running autoreconf --force --install --verbose"
autoreconf --force --install --verbose || exit $?
cd $olddir
test -n "$NOCONFIGURE" || {
  echo "running configure $@"
  "$srcdir/configure" "$@"
}


引用


linux系统中开机自启的三种方式_灬紫荆灬-CSDN博客_linux开机自启动


linux /etc/init.d和/etc/rc/init.d联系,运行级别,/etc/rc.d/init.d执行流程_mengzuchao的专栏-CSDN博客

相关文章
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
113 1
|
2天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
35 13
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
65 2
6种方法打造出色的Shell脚本
|
24天前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
30 0
Linux 如何更改默认 Shell
|
1月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
61 1
|
1月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
50 2
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
78 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
2月前
|
存储 移动开发 网络协议
【实战指南】从零构建嵌入式远程Shell,提升跨地域协作效率(2)
本文《从零构建嵌入式远程Shell》的第二部分,介绍了如何通过模块化设计和功能增强来优化远程Shell,包括支持阻塞命令、增加用户主动结束Shell进程的能力等,提升了跨地域协作效率。文中提供了详细的代码示例和验证步骤,适合开发者深入学习。
56 8
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
57 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。