当前位置:   article > 正文

嵌入式linux应用开发之常用shell脚本总结_嵌入式linux 脚本执行程序

嵌入式linux 脚本执行程序

总结下日常工作中常用的linux下的shell脚本。

linux的shell脚本很强大,可以用来做一些特殊功能。shell脚本语法虽然很简单,但是有时候把经常忘,还得再写一遍且验证ok才能用,这里总结下留作备忘。

关于shell脚本的学习觉得不需要太刻意,根据需要来。看的多用的多了自然就会了,至少能看懂吧。

目录

启用硬件IO口

开机后应用启动其它应用服务

触发执行其它应用

拷贝U盘中的文件到设备中

拷贝U盘数据

Linux应用开机自启动

Linux的引导过程

rc和rcS脚本

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

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

应用升级脚本

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

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

自动下载并构建freetype脚本

首次安装脚本install.sh

autogen.sh


启用硬件IO口

enGPIO.sh

  1. #!/bin/sh
  2. mygpioPath1="/sys/class/gpio/gpio115"
  3. mygpioPath2="/sys/class/gpio/gpio116"
  4. buzzGPIO="/sys/class/gpio/gpio15"
  5. qrd_pwr="/sys/class/gpio/gpio121"
  6. power_down="/sys/class/gpio/gpio128"
  7. touch_key="/sys/class/gpio/gpio112"
  8. oth_pwr="/sys/class/gpio/gpio130"
  9. echo "shell exec open..."
  10. #enable voice
  11. if [ ! -d "$mygpioPath1" ]; then
  12. echo 115 > /sys/class/gpio/export
  13. fi
  14. if [ -d "$mygpioPath1" ]; then
  15. echo "out" > "/sys/class/gpio/gpio115/direction"
  16. echo "1" > "/sys/class/gpio/gpio115/value"
  17. fi
  18. #enable voice
  19. #if [ ! -d "$mygpioPath2" ]; then
  20. # echo 116 > /sys/class/gpio/export
  21. #fi
  22. #if [ -d "$mygpioPath2" ]; then
  23. # echo "out" > "/sys/class/gpio/gpio116/direction"
  24. # echo "1" > "/sys/class/gpio/gpio116/value"
  25. #fi
  26. #enable buzzse
  27. if [ ! -d "$buzzGPIO" ]; then
  28. echo 15 > /sys/class/gpio/export
  29. fi
  30. if [ -d "$buzzGPIO" ]; then
  31. echo "out" > "/sys/class/gpio/gpio15/direction"
  32. echo "0" > "/sys/class/gpio/gpio15/value"
  33. fi
  34. if [ ! -d "$qrd_pwr" ]; then
  35. echo 121 > /sys/class/gpio/export
  36. fi
  37. if [ -d "$qrd_pwr" ]; then
  38. echo "out" > "/sys/class/gpio/gpio121/direction"
  39. echo "0" > "/sys/class/gpio/gpio121/value"
  40. fi
  41. #enable power down check
  42. if [ ! -d "$power_down" ]; then
  43. echo 128 > /sys/class/gpio/export
  44. fi
  45. if [ -d "$power_down" ]; then
  46. echo "in" > "/sys/class/gpio/gpio128/direction"
  47. fi
  48. #enable touch key check
  49. if [ ! -d "$touch_key" ]; then
  50. echo 112 > /sys/class/gpio/export
  51. fi
  52. if [ -d "$touch_key" ]; then
  53. echo "in" > "/sys/class/gpio/gpio112/direction"
  54. fi
  55. #enable oth_pwr
  56. if [ ! -d "$oth_pwr" ]; then
  57. echo 130 > /sys/class/gpio/export
  58. fi
  59. if [ -d "$qrd_pwr" ]; then
  60. echo "out" > "/sys/class/gpio/gpio130/direction"
  61. echo "0" > "/sys/class/gpio/gpio130/value"
  62. fi

开机后应用启动其它应用服务

  1. int main(int argc, char ** argv)
  2. {
  3. printf("main\n");
  4. system("../opt/enGPIO.sh");
  5. system("killall -9 monitor");
  6. //启动监控服务monitor进程
  7. system("../opt/startmonitor.sh");
  8. }

startmonitor.sh 

  1. #!/bin/bash
  2. fileName="/app/city_app/opt/monitor"
  3. buzzGPIO="/sys/class/gpio/gpio15"
  4. #enable buzzse for notifying success
  5. function beep_notify()
  6. {
  7. if [ ! -d "$buzzGPIO" ]; then
  8. echo 15 > /sys/class/gpio/export
  9. fi
  10. if [ -d "$buzzGPIO" ]; then
  11. echo "out" > "/sys/class/gpio/gpio15/direction"
  12. echo "1" > "/sys/class/gpio/gpio15/value"
  13. sleep 1
  14. echo "0" > "/sys/class/gpio/gpio15/value"
  15. fi
  16. }
  17. function CheckProcess()
  18. {
  19. PROCESS_NUM=`ps | grep "$1" | grep -v "grep" | wc -l`
  20. return $PROCESS_NUM
  21. }
  22. if [ ! -f $fileName ]; then
  23.    echo "error!monitor exe not exit!"
  24. exit 1
  25. else
  26. echo "find monitor exe,begin start..."
  27. CheckProcess monitor
  28. if [ $? -eq 0 ];then
  29. echo "no monitor progress find!"
  30. else
  31. echo "find monitor,..."
  32. killall -9 monitor
  33. sleep 1
  34. fi
  35. cd /app/city_app/opt/
  36. ./monitor &
  37. echo "start ok"
  38. beep_notify
  39. exit 0
  40. fi

触发执行其它应用

如uplog.sh,触发ftp应用上传日志文件

  1. #!/bin/sh
  2. echo "upload log to ftp server..."
  3. echo $1
  4. if [ -z $1 ]; then
  5. today=`date +"%Y%m%d"`
  6. else
  7. today=$1
  8. fi
  9. echo $today
  10. function getfname()
  11. {
  12. echo $1
  13. filename=$(find /log/ -name "$1")
  14. echo $filename
  15. return 0
  16. }
  17. #filename="find ./ -name "*${today}.log""
  18. #echo $filename
  19. getfname *${today}.log
  20. echo $filename
  21. ../opt/ftp -ftpcfg=/../opt/ftpcfg.ini -fname=$filename

拷贝U盘中的文件到设备中

setconfig.sh,把U盘根目录下的config.ini文件拷贝到设置的指定目录下。

  1. #!/bin/bash
  2. usbPath="/media/usb"
  3. fileName="/media/usb/config_up.ini"
  4. buzzGPIO="/sys/class/gpio/gpio15"
  5. #enable buzzse for notifying success
  6. function beep_notify()
  7. {
  8. if [ ! -d "$buzzGPIO" ]; then
  9. echo 15 > /sys/class/gpio/export
  10. fi
  11. if [ -d "$buzzGPIO" ]; then
  12. echo "out" > "/sys/class/gpio/gpio15/direction"
  13. echo "1" > "/sys/class/gpio/gpio15/value"
  14. sleep 1
  15. echo "0" > "/sys/class/gpio/gpio15/value"
  16. fi
  17. }
  18. setconfig()
  19. {
  20. echo "find usb device,begin copy config_ini..."
  21. if [ ! -f $fileName ]; then
  22.    echo "config file not exit!"
  23. return 1
  24. else
  25. cp $fileName /app/city_app/etc/
  26. return 0
  27. fi
  28. }
  29. if [ -d "$usbPath" ]; then
  30. setconfig
  31. if [ $? -ne 0 ] ;then
  32. echo "faild to set config"
  33. exit 1
  34. fi
  35. beep_notify
  36. beep_notify
  37. beep_notify
  38. echo "set ok"
  39. exit 0
  40. else
  41. echo "no usb device found!"
  42. exit 1
  43. fi

拷贝U盘数据

  1. #!/bin/bash
  2. usbPath="/media/usb"
  3. fileName="/media/usb/qrlinux"
  4. dbName="/app/city_app/opt/bus.db"
  5. buzzGPIO="/sys/class/gpio/gpio15"
  6. #enable buzzse for notifying success
  7. function beep_notify()
  8. {
  9. if [ ! -d "$buzzGPIO" ]; then
  10. echo 15 > /sys/class/gpio/export
  11. fi
  12. if [ -d "$buzzGPIO" ]; then
  13. echo "out" > "/sys/class/gpio/gpio15/direction"
  14. echo "1" > "/sys/class/gpio/gpio15/value"
  15. sleep 1
  16. echo "0" > "/sys/class/gpio/gpio15/value"
  17. fi
  18. }
  19. function CheckProcess()
  20. {
  21. PROCESS_NUM=`ps | grep "$1" | grep -v "grep" | wc -l`
  22. return $PROCESS_NUM
  23. }
  24. copydata()
  25. {
  26. echo "find usb device,begin copy data..."
  27. if [ ! -f $dbName ]; then
  28.    echo "db file not exit!"
  29. return 1
  30. else
  31. cp -v /app/city_app/opt/bus.db /media/usb/
  32. cd /media/usb/
  33. ls -l
  34. return 0
  35. fi
  36. }
  37. if [ -d "$usbPath" ]; then
  38. copydata
  39. if [ $? -ne 0 ] ;then
  40. echo "faild to copy data"
  41. fi
  42. else
  43. echo "no usb device found!"
  44. exit 1
  45. fi
  46. if [ ! -f $fileName ]; then
  47.    echo "qrlinux file not exit!"
  48. else
  49. echo "find qrlinux file,begin updata..."
  50. CheckProcess qrlinux
  51. if [ $? -eq 0 ];then
  52. echo "no qrlinux progress find!"
  53. else
  54. echo "find qrlinux,..."
  55. killall -9 qrlinux
  56. sleep 2
  57. fi
  58. cp -v $fileName /app/city_app/opt/
  59. cd /app/city_app/opt/
  60. ls -l
  61. echo "cp ok"
  62. umount /media/usb/
  63. beep_notify
  64. exit 0
  65. fi

Linux应用开机自启动

/etc/init.d/文件夹下放置有很多常用服务的控制脚本和其他的一些脚本。

K开头的脚本文件代表运行级别加载时需要关闭的,S开头的代表需要执行。

因此当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可。如:

[root@localhost ~]# ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh

sshd是具体服务的脚本文件,S100ssh是其软链接,S开头代表加载时自启动

如果需要在多个运行级别下设置自启动,则需建立多个软链接。

Linux的引导过程

系统启动之后,在进入init.d之前,我们先来看看系统都做了什么工作。系统加电之后,首先进行的硬件自检,然后是bootload对系统的初始化,加载内核。

内核被加载到内存之后,就开始执行了。一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动进行初始化。

从这开始内核就能够挂装根文件系统。内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。

在这里插入图片描述

 Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。

这个级别从0到6 ,具有不同的功能。不同的运行级定义如下: 

0 – 停机(千万别把initdefault设置为0,否则系统永远无法启动)

1 – 单用户模式,root权限,用于系统维护,禁止远程登陆

2 – 多用户状态,没有 NFS

3 – 标准多用户模式,登陆后进入命令行模式

4 – 系统未使用,保留

5 – 多用户图形模式,登陆后进入图形GUI模式

6 – 重新启动(千万不要把initdefault 设置为6,否则将一直在重启 )

服务器一般都是命令行模式,所以默认运行级别为 3

如何添加自启程序?
(1)/etc/init.d 目录中添加

以启动SVN为例

1)在 /etc/init.d 目录下创建启动服务的脚本

vim /etc/init.d/svn

#!/bin/bash
svnserve -d -r /svn仓库路径
设置执行权限

chmod 755 /etc/init.d/svn
2)把这个脚本软链接到 /etc/rc.d/rc3.d

ln -s /etc/init.d/svn /etc/rc.d/rc3.d/S101svn
S 代表是要执行这个脚本,101 是执行顺序,通常要大于60,这样可以保证基础服务都已经启动完成
重启linux测试

(2)/etc/rc.local 文件中添加

直接修改 /etc/rc.local

该脚本是在系统初始化级别脚本运行之后再执行的,因此可以在里面添加想在系统启动之后执行的脚本

(3)chkconfig 命令添加

如何禁止自启程序?
(1)直接删除 /etc/rc.d/rcN.d 目录的目标链接文件

(2)删除 /etc/rc.local 文件中定义的启动脚本

(3)查看自启动服务列表,从中选择目标服务执行禁止操作

chkconfig –list

chkconfig –del 服务名  

init.d里面放的都是什么东西。这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。
前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),该行/etc/rc.d/init.d里面的脚本,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。
系统是如何选择哪些需要启动哪些不需要启动?运行级别就起作用了。在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在有些linux源码中它都是一上来就check_runlevel(),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本。

/etc/init.d里面还放置了一些脚本可以用来管理服务用。比如:

可以使用start,stop,restart选项。例如,如果你想关闭网络,你可以使用如下形式的命令:

/etc/init.d/networking stop

又比如,你改变了网络设置,并且需要重启网络。你可以使用如下命令:

/etc/init.d/networking restart

 rc.local也是经常使用的一个脚本。该脚本是在系统初始化级别脚本运行之后再执行的,因此可以安全地在里面添加你想在系统启动之后执行的脚本。

rc和rcS脚本

  1. #!/bin/sh
  2. #
  3. # rc This file is responsible for starting/stopping
  4. # services when the runlevel changes.
  5. #
  6. # Optimization feature:
  7. # A startup script is _not_ run when the service was
  8. # running in the previous runlevel and it wasn't stopped
  9. # in the runlevel transition (most Debian services don't
  10. # have K?? links in rc{1,2,3,4,5} )
  11. #
  12. # Author: Miquel van Smoorenburg <miquels@cistron.nl>
  13. # Bruce Perens <Bruce@Pixar.com>
  14. #
  15. # Version: @(#)rc 2.78 07-Nov-1999 miquels@cistron.nl
  16. #
  17. . /etc/default/rcS
  18. export VERBOSE
  19. startup_progress() {
  20. step=$(($step + $step_change))
  21. if [ "$num_steps" != "0" ]; then
  22. progress=$((($step * $progress_size / $num_steps) + $first_step))
  23. else
  24. progress=$progress_size
  25. fi
  26. #echo "PROGRESS is $progress $runlevel $first_step + ($step of $num_steps) $step_change $progress_size"
  27. if type psplash-write >/dev/null 2>&1; then
  28. TMPDIR=/mnt/.psplash psplash-write "PROGRESS $progress" || true
  29. fi
  30. #if [ -e /mnt/.psplash/psplash_fifo ]; then
  31. # echo "PROGRESS $progress" > /mnt/.psplash/psplash_fifo
  32. #fi
  33. }
  34. #
  35. # Start script or program.
  36. #
  37. startup() {
  38. # Handle verbosity
  39. [ "$VERBOSE" = very ] && echo "INIT: Running $@..."
  40. case "$1" in
  41. *.sh)
  42. # Source shell script for speed.
  43. (
  44. trap - INT QUIT TSTP
  45. scriptname=$1
  46. shift
  47. . $scriptname
  48. )
  49. ;;
  50. *)
  51. "$@"
  52. ;;
  53. esac
  54. startup_progress
  55. }
  56. # Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
  57. trap ":" INT QUIT TSTP
  58. # Set onlcr to avoid staircase effect.
  59. stty onlcr 0>&1
  60. # Limit stack size for startup scripts
  61. [ "$STACK_SIZE" == "" ] || ulimit -S -s $STACK_SIZE
  62. # Now find out what the current and what the previous runlevel are.
  63. runlevel=$RUNLEVEL
  64. # Get first argument. Set new runlevel to this argument.
  65. [ "$1" != "" ] && runlevel=$1
  66. if [ "$runlevel" = "" ]
  67. then
  68. echo "Usage: $0 <runlevel>" >&2
  69. exit 1
  70. fi
  71. previous=$PREVLEVEL
  72. [ "$previous" = "" ] && previous=N
  73. export runlevel previous
  74. # Is there an rc directory for this new runlevel?
  75. if [ -d /etc/rc$runlevel.d ]
  76. then
  77. # Find out where in the progress bar the initramfs got to.
  78. PROGRESS_STATE=0
  79. #if [ -f /dev/.initramfs/progress_state ]; then
  80. # . /dev/.initramfs/progress_state
  81. #fi
  82. # Split the remaining portion of the progress bar into thirds
  83. progress_size=$(((100 - $PROGRESS_STATE) / 3))
  84. case "$runlevel" in
  85. 0|6)
  86. # Count down from -100 to 0 and use the entire bar
  87. first_step=-100
  88. progress_size=100
  89. step_change=1
  90. ;;
  91. S)
  92. # Begin where the initramfs left off and use 2/3
  93. # of the remaining space
  94. first_step=$PROGRESS_STATE
  95. progress_size=$(($progress_size * 2))
  96. step_change=1
  97. ;;
  98. *)
  99. # Begin where rcS left off and use the final 1/3 of
  100. # the space (by leaving progress_size unchanged)
  101. first_step=$(($progress_size * 2 + $PROGRESS_STATE))
  102. step_change=1
  103. ;;
  104. esac
  105. num_steps=0
  106. for s in /etc/rc$runlevel.d/[SK]*; do
  107. case "${s##/etc/rc$runlevel.d/S??}" in
  108. gdm|xdm|kdm|reboot|halt)
  109. break
  110. ;;
  111. esac
  112. num_steps=$(($num_steps + 1))
  113. done
  114. step=0
  115. # First, run the KILL scripts.
  116. if [ $previous != N ]
  117. then
  118. for i in /etc/rc$runlevel.d/K[0-9][0-9]*
  119. do
  120. # Check if the script is there.
  121. [ ! -f $i ] && continue
  122. # Stop the service.
  123. startup $i stop
  124. done
  125. fi
  126. # Now run the START scripts for this runlevel.
  127. for i in /etc/rc$runlevel.d/S*
  128. do
  129. [ ! -f $i ] && continue
  130. if [ $previous != N ] && [ $previous != S ]
  131. then
  132. #
  133. # Find start script in previous runlevel and
  134. # stop script in this runlevel.
  135. #
  136. suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
  137. stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
  138. previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
  139. #
  140. # If there is a start script in the previous level
  141. # and _no_ stop script in this level, we don't
  142. # have to re-start the service.
  143. #
  144. [ -f $previous_start ] && [ ! -f $stop ] && continue
  145. fi
  146. case "$runlevel" in
  147. 0|6)
  148. startup $i stop
  149. ;;
  150. *)
  151. startup $i start
  152. ;;
  153. esac
  154. done
  155. fi
  1. #!/bin/bash
  2. #myapp application start mechnism
  3. #manu run myapp
  4. #set -e
  5. curdir=$(pwd)
  6. myapp_city_app_name=city_app
  7. #search executable file in bin directory
  8. #and start the file.
  9. #the file number must be only one!!!!
  10. function searchBinAndRun()
  11. {
  12. # echo "searchBinAndRun...enter"
  13. path=$1
  14. cd $path
  15. if [ ! -d bin ];
  16. then
  17. echo "no bin directory ..."
  18. return 1
  19. fi
  20. cd bin
  21. files=$(ls $path/bin)
  22. echo "path= $path"
  23. for filename in $files
  24. do
  25. echo $filename
  26. if [ ! -d $filename ];
  27. then
  28. chmod 777 $filename
  29. #./$filename &
  30. ./$filename
  31. return 0
  32. fi
  33. done
  34. return 1
  35. }
  36. #set env variable for application
  37. function setAppEnv()
  38. {
  39. # echo "setAppEnv...enter"
  40. path=$1
  41. echo "path= $path"
  42. if [ -d lib ];
  43. then
  44. cd lib
  45. export LD_LIBRARY_PATH=$(pwd)
  46. #echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
  47. fi
  48. }
  49. #start myapp specified application
  50. #after opkg the app ipk
  51. function startmyappApp()
  52. {
  53. echo "startmyappApp...start"
  54. if [ $# -lt 1 ] ;
  55. then
  56. echo "para is not enough!!,quit"
  57. return 1
  58. fi
  59. appname=$1
  60. cd /app
  61. #echo "---->$appname"
  62. if [ -d $appname ];
  63. then
  64. cd $appname
  65. #echo "pwd = $(pwd)"
  66. setAppEnv /app/$appname
  67. if searchBinAndRun /app/$appname ;
  68. then
  69. echo "$appname starts success"
  70. return 0
  71. else
  72. echo "$appname starts error"
  73. return 1
  74. fi
  75. else
  76. echo "$appname dir isnot exist!!"
  77. return 1
  78. fi
  79. }
  80. #
  81. ###myapp start main
  82. #
  83. #######try to start myapp customersized app########
  84. ####monitor myapp-app,may be restarted!!############
  85. echo "2--->try to start customersized app....."
  86. startmyappApp $myapp_city_app_name
  87. exit 0

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

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

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

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

run_app.sh

  1. #!/bin/bash
  2. export LD_LIBRARY_PATH=/app/city_app/lib/
  3. echo $LD_LIBRARY_PATH
  4. cd /app/city_app/bin/
  5. ./b503_app

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

run_app.sh

应用升级脚本

start_remoteupdate.sh

  1. #!/bin/bash
  2. singelName="remoteupdate"
  3. fileName="/usr/bin/remoteupdate"
  4. configFile="/app/update.conf"
  5. function CheckProcess()
  6. {
  7. PROCESS_NUM=`ps | grep "$1" | grep -v "grep" | wc -l`
  8. return $PROCESS_NUM
  9. }
  10. function startProcess()
  11. {
  12. echo "check process run status"
  13. CheckProcess $singelName
  14. if [ $? -eq 0 ];then
  15. echo "progress is not run"
  16. else
  17. echo "process is running"
  18. #killall -9 $singelName
  19. #sleep 1
  20. exit 0
  21. fi
  22. echo "start remoteupdate ..."
  23. $singelName &
  24. echo "start end"
  25. }
  26. #copy config file
  27. if [ -f $configFile ];then
  28. echo "config file exist"
  29. else
  30. echo "copy update.conf file"
  31. cp /app/city_app/opt/update.conf /app/
  32. sync
  33. if [ -f $configFile ];then
  34. echo "copy ok"
  35. fi
  36. fi
  37. #start process remoteupdate
  38. if [ ! -f $fileName ];then
  39. echo "copy remoteupdate process to /usr/bin"
  40. cp /app/city_app/opt/$singelName /usr/bin/
  41. sync
  42. if [ -f $fileName ];then
  43. echo "copy ok"
  44. startProcess
  45. exit 0
  46. else
  47. echo "copy fail"
  48. exit 1
  49. fi
  50. else
  51. echo "remoteupdate file exsit"
  52. startProcess
  53. exit 0
  54. fi

应用监控和升级服务脚本

app_monitor.sh

  1. #!/bin/bash
  2. #######city app monitor deamon ########
  3. function checkAppRun()
  4. {
  5. flag=0
  6. val=0
  7. cnt=0
  8. max=$2
  9. #echo "checkApprun...$1"
  10. while [ $val -lt $max ]
  11. do
  12. cnt=$(ps | grep $1 | wc -l)
  13. if [ $cnt -le 1 ];
  14. then
  15. let flag+=1
  16. sleep 1
  17. let val+=1
  18. else
  19. break
  20. fi
  21. done
  22. if [ $flag -ge $max ];
  23. then
  24. return 0
  25. #$1 app is not running
  26. else
  27. return 1
  28. #$1 app has been run
  29. fi
  30. }
  31. function CheckProcess()
  32. {
  33. PROCESS_NUM=`ps | grep "$1" | grep -v "grep" | wc -l`
  34. return $PROCESS_NUM
  35. }
  36. function monitor_app()
  37. {
  38. while true
  39. do
  40. CheckProcess b503_app
  41. if [ $? -ne 1 ] ;
  42. then
  43. if [ $? -ne 0 ];
  44. then
  45. killall -9 b503_app
  46. fi
  47. source /etc/init.d/app_update_b503_app.sh
  48. fi
  49. # CheckProcess remoteupdate
  50. # if [ $? -ne 1 ] ;
  51. # then
  52. # if [ $? -ne 0 ];
  53. # then
  54. # killall -9 remoteupdate
  55. # fi
  56. # source /etc/init.d/app_start_remoteupdate.sh
  57. # fi
  58. done
  59. }
  60. function monitor_b503_ft()
  61. {
  62. while true
  63. do
  64. CheckProcess b503_ft
  65. if [ $? -eq 0 ] ;
  66. then
  67. break
  68. else
  69. sleep 1
  70. fi
  71. done
  72. }
  73. function monitor_ft_app()
  74. {
  75. while true
  76. do
  77. checkAppRun b503_ft 2
  78. if [ $? -eq 0 ] ;
  79. then
  80. break
  81. fi
  82. done
  83. }
  84. ################main#####################
  85. ####synchronize date and rtc time#######
  86. #date
  87. #hwclock -w --local
  88. ########################################
  89. source /etc/init.d/app_update_b503_ft.sh
  90. #monitor_ft_app &
  91. checkAppRun b503_ft 2
  92. if [ $? -eq 0 ] ;
  93. then
  94. source /etc/init.d/app_update_b503_app.sh
  95. monitor_app &
  96. else
  97. monitor_b503_ft
  98. source /etc/init.d/app_update_b503_app.sh
  99. monitor_app &
  100. fi

应用ipk包安装脚本

  1. #!/bin/bash
  2. #b503 application update mechnism
  3. #search directory in order, /update,/media/usb/
  4. #set -e
  5. buzzGPIO="/sys/class/gpio/gpio15"
  6. curdir=$(pwd)
  7. #b503_city_app_name=city_app
  8. #enable buzzse for notifying success
  9. function beep_notify()
  10. {
  11. if [ ! -d "$buzzGPIO" ]; then
  12. echo 15 > /sys/class/gpio/export
  13. fi
  14. if [ -d "$buzzGPIO" ]; then
  15. echo "out" > "/sys/class/gpio/gpio15/direction"
  16. echo "1" > "/sys/class/gpio/gpio15/value"
  17. sleep 1
  18. echo "0" > "/sys/class/gpio/gpio15/value"
  19. fi
  20. }
  21. #install all ipks in specified directory
  22. function install_ipks()
  23. {
  24. path=$1
  25. files=$(ls $path)
  26. for filename in $files
  27. do
  28. if [ "${filename##*.}"x = "ipk"x ];
  29. then
  30. echo $filename
  31. cd $path
  32. opkg install --force-reinstall --force-downgrade --force-overwrite $filename
  33. # sleep 1
  34. fi
  35. done
  36. }
  37. #check and create directory by specified path
  38. function check_and_mkdir()
  39. {
  40. result_path=$1
  41. result_name=$2
  42. cd $result_path
  43. # echo "$result_path"
  44. if [ ! -d $result_name ];
  45. then
  46. #echo "mkdir $result_name"
  47. mkdir -p $result_name
  48. #else
  49. # echo "$result_name is exit!!"
  50. fi
  51. }
  52. #check if updating from update directory
  53. function isUpdateIpkFromUpdir()
  54. {
  55. #echo "1--->search update ipk directory."
  56. cd /update
  57. #cnt=$(find -name "*.ipk" | wc -l)
  58. if [ -d ipk ];
  59. then
  60. cnt=$(ls ipk | wc -l)
  61. if [ $cnt -ge 1 ] ;
  62. then
  63. echo "1.1--->check update flag !"
  64. cnt=$(find -name "update.txt" | wc -l )
  65. if [ $cnt -ge 1 ];
  66. then
  67. var=$(cat update.txt)
  68. if [[ $var -eq 1 ]];
  69. then
  70. echo "1.2--->update-flag is 1!"
  71. return 0
  72. else
  73. echo "1.3--->update flag is 0"
  74. return 1
  75. fi
  76. else
  77. echo "1.8--->no update.txt.."
  78. return 1
  79. fi
  80. else
  81. echo "1.9--->there is no ipk files in update directory!"
  82. return 1
  83. fi
  84. fi
  85. return 1
  86. }
  87. #check if updating bin from update directory
  88. function isUpdateBinFromUpdir()
  89. {
  90. #echo "1--->search update bin directory."
  91. cd /update
  92. if [ -d bin ];
  93. then
  94. cnt=$(ls bin | wc -l)
  95. if [ $cnt -ge 1 ] ;
  96. then
  97. cnt=$(find -name "update.txt" | wc -l )
  98. if [ $cnt -ge 1 ];
  99. then
  100. var=$(cat update.txt)
  101. if [[ $var -eq 2 ]];
  102. then
  103. return 0
  104. else
  105. return 1
  106. fi
  107. else
  108. return 1
  109. fi
  110. fi
  111. fi
  112. return 1
  113. }
  114. #check if updating lib from update directory
  115. function isUpdateLibFromUpdir()
  116. {
  117. #echo "1--->search update lib directory."
  118. cd /update i
  119. if [ -d lib ];
  120. then
  121. cnt=$(ls lib | wc -l)
  122. if [ $cnt -ge 1 ] ;
  123. then
  124. cnt=$(find -name "update.txt" | wc -l )
  125. if [ $cnt -ge 1 ];
  126. then
  127. var=$(cat update.txt)
  128. if [[ $var -eq 3 ]];
  129. then
  130. return 0
  131. else
  132. return 1
  133. fi
  134. else
  135. return 1
  136. fi
  137. fi
  138. fi
  139. return 1
  140. }
  141. #check if updating audio from update directory
  142. function isUpdateAudioFromUpdir()
  143. {
  144. #echo "1--->search update audio directory."
  145. cd /update
  146. if [ -d audio ];
  147. then
  148. cnt=$(ls audio | wc -l)
  149. if [ $cnt -ge 1 ] ;
  150. then
  151. cnt=$(find -name "update.txt" | wc -l )
  152. if [ $cnt -ge 1 ];
  153. then
  154. var=$(cat update.txt)
  155. if [[ $var -eq 4 ]];
  156. then
  157. return 0
  158. else
  159. return 1
  160. fi
  161. else
  162. return 1
  163. fi
  164. fi
  165. fi
  166. return 1
  167. }
  168. #check if updating form udisk
  169. function isUpdateFromUdisk()
  170. {
  171. #echo "2--->search u disk directory."
  172. cd /media
  173. cnt=$(find -name "usb" | wc -l )
  174. if [ $cnt -ge 1 ];
  175. then
  176. cd /media/usb
  177. cnt=$(find -name "*.ipk" | wc -l)
  178. if [ $cnt -ge 1 ] ;
  179. then
  180. echo "2.1--->udisk,find ipk files"
  181. return 0
  182. else
  183. echo "2.2--->udisk,no b503-app.ipk......"
  184. return 1
  185. fi
  186. else
  187. #echo "2.9:no udisk is inserted......."
  188. return 1
  189. fi
  190. }

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

service.sh

  1. #!/usr/bin/env sh
  2. export ALIPAY_ROOT=$(cd `dirname $0`; cd ../../; pwd)
  3. # define the global value
  4. pid=
  5. start_service() {
  6. cd ${ALIPAY_ROOT}/iotsdk/bin
  7. nohup ./alipay_iotd >/dev/null 2>&1 &
  8. }
  9. PS_LINE=`ps |grep alipay_iotd|grep -v grep`
  10. if [ ! -z "${PS_LINE}" ]; then
  11. #pids=(${PS_LINE// / })
  12. pid=`echo ${PS_LINE} | cut -d ' ' -f 1`
  13. #pid=${pids[0]}
  14. echo "snapshot pid is ${pid}"
  15. fi
  16. case $1 in
  17. "keepalive")
  18. if [ -z "${pid}" ]; then
  19. start_service
  20. fi
  21. ;;
  22. "startup")
  23. if [ -z "${pid}" ]; then
  24. start_service
  25. else
  26. echo "Service was already started!"
  27. fi
  28. ;;
  29. "shutdown")
  30. if [ -n "${pid}" ]; then
  31. kill -9 "${pid}"
  32. echo "Service was terminated!"
  33. fi
  34. ;;
  35. "restart")
  36. if [ -n "${pid}" ]; then
  37. echo "Stop service..."
  38. kill -9 "${pid}"
  39. echo "Service was terminated!"
  40. fi
  41. sleep 3
  42. start_service
  43. ;;
  44. "status")
  45. echo "Service is running on proc: ${pid}"
  46. ;;
  47. *)
  48. echo "Unsupported command!"
  49. ;;
  50. esac

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

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

自动下载并构建freetype脚本

  1. #!/bin/bash
  2. set -x
  3. set -o errexit -o nounset
  4. # 22.0.16 is the libtool version of 2.9.0
  5. if pkg-config --atleast-version 22.0.16 freetype2; then exit; fi
  6. pushd $HOME
  7. wget http://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.bz2
  8. tar xf freetype-2.9.tar.bz2
  9. pushd freetype-2.9
  10. ./autogen.sh
  11. ./configure --prefix=$HOME/.local
  12. make -j4 install
  13. popd
  14. popd

首次安装脚本install.sh

  1. #!/usr/bin/env sh
  2. #SOURCE_DIR=`pwd`
  3. SOURCE_DIR=/app/city_app/alipay
  4. TARGET_DIR=/app/alipay
  5. if [ ! -d $TARGET_DIR ]; then
  6. mkdir $TARGET_DIR
  7. fi
  8. if [ ! -d $TARGET_DIR/iotsdk ]; then
  9. mkdir $TARGET_DIR/iotsdk
  10. fi
  11. if [ ! -d $TARGET_DIR/iotsdk/bin ]; then
  12. mkdir $TARGET_DIR/iotsdk/bin
  13. fi
  14. if [ ! -d $TARGET_DIR/iotsdk/conf ]; then
  15. mkdir $TARGET_DIR/iotsdk/conf
  16. fi
  17. if [ ! -d $TARGET_DIR/runtime ]; then
  18. mkdir $TARGET_DIR/runtime
  19. fi
  20. if [ -e $SOURCE_DIR/iotsdk/bin/alipay_iotd ]; then
  21. cp $SOURCE_DIR/iotsdk/bin/alipay_iotd $TARGET_DIR/iotsdk/bin
  22. fi
  23. if [ -e $SOURCE_DIR/iotsdk/bin/alipay_iotmd ]; then
  24. cp $SOURCE_DIR/iotsdk/bin/alipay_iotmd $TARGET_DIR/iotsdk/bin
  25. fi
  26. if [ -e $SOURCE_DIR/iotsdk/bin/monitor.sh ]; then
  27. cp $SOURCE_DIR/iotsdk/bin/monitor.sh $TARGET_DIR/iotsdk/bin
  28. fi
  29. if [ -e $SOURCE_DIR/iotsdk/bin/service.sh ]; then
  30. cp $SOURCE_DIR/iotsdk/bin/service.sh $TARGET_DIR/iotsdk/bin
  31. fi

autogen.sh

  1. #!/bin/sh
  2. # Run this to generate all the initial makefiles, etc.
  3. test -n "$srcdir" || srcdir=`dirname "$0"`
  4. test -n "$srcdir" || srcdir=.
  5. olddir=`pwd`
  6. cd $srcdir
  7. #echo -n "checking for ragel... "
  8. #which ragel || {
  9. # echo "You need to install ragel... See http://www.complang.org/ragel/"
  10. # exit 1
  11. #}
  12. echo -n "checking for pkg-config... "
  13. which pkg-config || {
  14. echo "*** No pkg-config found, please install it ***"
  15. exit 1
  16. }
  17. echo -n "checking for libtoolize... "
  18. which glibtoolize || which libtoolize || {
  19. echo "*** No libtoolize (libtool) found, please install it ***"
  20. exit 1
  21. }
  22. echo -n "checking for gtkdocize... "
  23. if which gtkdocize ; then
  24. gtkdocize --copy || exit 1
  25. else
  26. echo "*** No gtkdocize (gtk-doc) found, skipping documentation ***"
  27. echo "EXTRA_DIST = " > gtk-doc.make
  28. fi
  29. echo -n "checking for autoreconf... "
  30. which autoreconf || {
  31. echo "*** No autoreconf (autoconf) found, please install it ***"
  32. exit 1
  33. }
  34. echo "running autoreconf --force --install --verbose"
  35. autoreconf --force --install --verbose || exit $?
  36. cd $olddir
  37. test -n "$NOCONFIGURE" || {
  38. echo "running configure $@"
  39. "$srcdir/configure" "$@"
  40. }

打印版本号

  1. #打印版本信息
  2. version ()
  3. {
  4. echo
  5. echo "`basename $1` version $VERSION"
  6. echo "xxx脚本"
  7. echo
  8. exit 0
  9. }

执行命令不带回显输出

  1. #execute执行语句成功与否打印
  2. execute ()
  3. {
  4. $* >/dev/null
  5. if [ $? -ne 0 ]; then
  6. echo
  7. echo "错误: 执行 $*"
  8. echo
  9. exit 1
  10. fi
  11. }

具体解释:

这段代码定义了一个名为 execute 的函数。函数接受一个命令作为参数,并执行该命令。 具体的解释如下:

1. $* >/dev/null :这一行将函数参数作为命令执行,并将输出重定向到 /dev/null ,即丢弃输出。这样做的目的是不在标准输出中显示命令的执行结果。

2. if [ $? -ne 0 ]; then$? 是上一条命令的退出状态码。通过 $? 来判断上一条命令的执行结果。如果退出状态码不等于0,表示命令执行失败。

3. echo :如果命令执行失败,打印一个空行。

4. echo "错误: 执行 $*" :打印错误消息,其中 $* 表示传递给函数的命令。

5. exit 1 :退出脚本并返回状态码1,表示执行失败。

这段代码的作用是执行传递给函数的命令,并检查命令的执行结果。如果命令执行失败,则打印错误消息并退出脚本。这可以用于在脚本中执行一系列命令,并在出现错误时进行处理。

inux的shell中的$0,$1,$#,$?分别都有特殊含义。

特殊变量的含义

在Linux的Shell脚本中,以下是常用的特殊变量的含义:

1. $0 :表示当前脚本的名称。即执行脚本时使用的命令名称。

2. $1 :表示第一个参数。当脚本被调用时,可以通过在命令行中传递参数来访问这些参数。 $1 表示第一个参数, $2 表示第二个参数,以此类推。

3. $# :表示传递给脚本的参数个数。它代表了命令行中传递的参数的数量。

4. $* :表示所有的参数列表。它将所有的参数作为一个单词展开,以空格分隔。可以通过遍历 $* 来访问每个参数。

5. $? :表示上一个命令的退出状态码。在Shell脚本中,每个命令执行后都会返回一个退出状态码,用于表示命令的执行结果。通常,0表示成功,非零值表示失败。

6. $$ :表示当前脚本的进程ID。

7. $! :表示最近一个在后台运行的命令的进程ID。

8. $@ :表示所有的参数列表。它将每个参数作为独立的单词展开,可以通过遍历 $@ 来访问每个参数。

9. $- :表示当前Shell的选项标志。

10. $IFS :表示输入字段分隔符,用于指定命令如何解析输入。

这些特殊变量在Shell脚本中用于获取脚本的名称、访问命令行参数、获取参数个数以及检查命令的执行结果。通过使用这些变量,可以编写更灵活和可定制的Shell脚本。

制作sd卡内核脚本

  1. #! /bin/sh
  2. #I.MX6 SD卡启动系统烧写脚本
  3. #版本v1.0
  4. #Author:ALIENTEK
  5. VERSION="1.0"
  6. #打印用法
  7. usage ()
  8. {
  9. echo "
  10. 用法: `basename $1` [选项] <(必选)-device> <(可选)-flash> <(可选)-ddrsize>
  11. 用法示例:
  12. sudo ./imx6mksdboot.sh -device /dev/sdd
  13. sudo ./imx6mksdboot.sh -device /dev/sdd -flash emmc -ddrsize 512
  14. 命令选项:
  15. -device SD卡块设备节点 (例如/dev/sdx)
  16. -flash 请选择开发板Flash类型(emmc | nand)
  17. -ddrsize 请选择DDR大小 (512 | 256)
  18. 可选选项:
  19. --version 打印版本信息.
  20. --help 打印帮助信息.
  21. "
  22. exit 1
  23. }
  24. #Uboot默认值
  25. Uboot='u-boot-dtb.imx'
  26. #execute执行语句成功与否打印
  27. execute ()
  28. {
  29. $* >/dev/null
  30. if [ $? -ne 0 ]; then
  31. echo
  32. echo "错误: 执行 $*"
  33. echo
  34. exit 1
  35. fi
  36. }
  37. #打印版本信息
  38. version ()
  39. {
  40. echo
  41. echo "`basename $1` version $VERSION"
  42. echo "I.MX6 SD卡制卡脚本"
  43. echo
  44. exit 0
  45. }
  46. #判断参数个数
  47. arg=$#
  48. if [ $arg -ne 6 ];then
  49. number=1
  50. while [ $# -gt 0 ]; do
  51. case $1 in
  52. --help | -h)
  53. usage $0
  54. ;;
  55. -device) shift; device=$1; shift; ;;
  56. --version) version $0;;
  57. *) copy="$copy $1"; shift; ;;
  58. esac
  59. done
  60. #判断字符串是否为零
  61. test -z $device && usage $0
  62. echo ""
  63. echo "根据下面的提示,补全缺省的参数-flash -ddrsize"
  64. read -p "请选择开发板参数,输入数字1~4,按Enter键确认
  65. 1.-flash emmc,-ddrsize 512
  66. 2.-flash emmc,-ddrsize 256
  67. 3.-flash nand,-ddrsize 512
  68. 4.-flash nand,-ddrsize 256
  69. 输入数字1~4(default 1): " number
  70. if [ -z $number ];then
  71. echo "使用默认参数:EMMC版本,DDR大小为512MB"
  72. else
  73. case $number in
  74. 1) echo '您已经选择开发板参数为:EMMC版本,DDR大小为512MB'
  75. Uboot='u-boot-imx6ull-14x14-ddr512-emmc.imx'
  76. ;;
  77. 2) echo '您已经选择开发板参数为:EMMC版本,DDR大小为256MB'
  78. Uboot='u-boot-imx6ull-14x14-ddr256-emmc.imx'
  79. ;;
  80. 3) echo '您已经选择开发板参数为:NAND FLASH版本,DDR大小为512MB'
  81. Uboot='u-boot-imx6ull-14x14-ddr512-nand-sd.imx'
  82. ;;
  83. 4) echo '您已经选择开发板参数为:NAND FLASH版本,DDR大小为256MB'
  84. Uboot='u-boot-imx6ull-14x14-ddr256-nand-sd.imx'
  85. ;;
  86. *) echo '输入的参数有误,退出制卡';exit;
  87. ;;
  88. esac
  89. fi
  90. else
  91. #命令行处理,根据选项获得参数
  92. while [ $# -gt 0 ]; do
  93. case $1 in
  94. --help | -h)
  95. usage $0
  96. ;;
  97. -device) shift; device=$1; shift; ;;
  98. -flash) shift; flash=$1; shift; ;;
  99. -ddrsize) shift; ddrsize=$1; shift; ;;
  100. --version) version $0;;
  101. *) copy="$copy $1"; shift; ;;
  102. esac
  103. done
  104. if [ $flash = "emmc" -a $ddrsize = "512" ];then
  105. Uboot='u-boot-imx6ull-14x14-ddr512-emmc.imx'
  106. echo '您已经选择开发板参数为:EMMC版本,DDR大小为512MB'
  107. elif [ $flash = "emmc" -a $ddrsize = "256" ];then
  108. Uboot='u-boot-imx6ull-14x14-ddr256-emmc.imx'
  109. echo '您已经选择开发板参数为:EMMC版本,DDR大小为256MB'
  110. elif [ $flash = "nand" -a $ddrsize = "512" ];then
  111. Uboot='u-boot-imx6ull-14x14-ddr512-nand-sd.imx'
  112. echo '您已经选择开发板参数为:NAND FLASH版本,DDR大小为512MB'
  113. elif [ $flash = "nand" -a $ddrsize = "256" ];then
  114. Uboot='u-boot-imx6ull-14x14-ddr256-nand-sd.imx'
  115. echo '您的开发板参数为:NAND FLASH版本,DDR大小为256MB'
  116. else
  117. echo '参数有误!'
  118. usage $0
  119. fi
  120. fi
  121. #测试制卡包当前目录下是否缺失制卡所需要的文件
  122. sdkdir=$PWD
  123. if [ ! -d $sdkdir ]; then
  124. echo "错误: $sdkdir目录不存在"
  125. exit 1
  126. fi
  127. if [ ! -f $sdkdir/filesystem/ *.tar.* ]; then
  128. echo "错误: $sdkdir/filesystem/下找不到文件系统压缩包"
  129. exit 1
  130. fi
  131. if [ ! -f $sdkdir/boot/zImage ]; then
  132. echo "错误: $sdkdir/boot/下找不到zImage"
  133. exit 1
  134. fi
  135. #判断选择的块设备是否存在及是否是一个块设备
  136. if [ ! -b $device ]; then
  137. echo "错误: $device 不是一个块设备文件"
  138. exit 1
  139. fi
  140. #这里防止选错设备,否则会影响Ubuntu系统的启动
  141. if [ $device = '/dev/sda' ];then
  142. echo "请不要选择sda设备,/dev/sda通常是您的Ubuntu硬盘!
  143. 继续操作你的系统将会受到影响!脚本已自动退出"
  144. exit 1
  145. fi
  146. echo "即将进行制作SD系统启动卡,大约花费几分钟时间,请耐心等待!"
  147. echo "************************************************************"
  148. echo "* 注意:这将会清除$device所有的数据 *"
  149. echo "* 在脚本执行时请不要将$device拔出 *"
  150. echo "* 请按<Enter>确认继续 *"
  151. echo "************************************************************"
  152. read enter
  153. #格式化前要卸载
  154. for i in `ls -1 $device?`; do
  155. echo "卸载 device '$i'"
  156. umount $i 2>/dev/null
  157. done
  158. #执行格式化$device
  159. execute "dd if=/dev/zero of=$device bs=1024 count=1024"
  160. #第一个分区为64M用来存放设备树与内核镜像文件,因为设备树与内核都比较小,不需要太大的空间
  161. #第二个分区为SD卡的总大小-64M,用来存放文件系统
  162. cat << END | fdisk -H 255 -S 63 $device
  163. n
  164. p
  165. 1
  166. +64M
  167. n
  168. p
  169. 2
  170. t
  171. 1
  172. c
  173. a
  174. 1
  175. w
  176. END
  177. #两个分区处理
  178. PARTITION1=${device}1
  179. if [ ! -b ${PARTITION1} ]; then
  180. PARTITION1=${device}1
  181. fi
  182. PARTITION2=${device}2
  183. if [ ! -b ${PARTITION2} ]; then
  184. PARTITION2=${device}2
  185. fi
  186. #第一个分区创建为Fat32格式
  187. echo "格式化 ${device}1 ..."
  188. if [ -b ${PARTITION1} ]; then
  189. mkfs.vfat -F 32 -n "boot" ${PARTITION1}
  190. else
  191. echo "错误: /dev下找不到 SD卡 boot分区"
  192. fi
  193. #第二个分区创建为ext4格式
  194. echo "格式化${device}2 ..."
  195. if [ -b ${PARITION2} ]; then
  196. mkfs.ext4 -F -L "rootfs" ${PARTITION2}
  197. else
  198. echo "错误: /dev下找不到 SD卡 rootfs分区"
  199. fi
  200. while [ ! -e $device ]
  201. do
  202. sleep 1
  203. echo "wait for $device appear"
  204. done
  205. echo "正在烧写${Uboot}${device}"
  206. execute "dd if=$sdkdir/boot/$Uboot of=$device bs=1024 seek=1 conv=fsync"
  207. sync
  208. echo "烧写${Uboot}${device}完成!"
  209. echo "正在准备复制..."
  210. echo "正在复制设备树与内核到${device}1,请稍候..."
  211. execute "mkdir -p /tmp/sdk/$$"
  212. execute "mount ${device}1 /tmp/sdk/$$"
  213. execute "cp -r $sdkdir/boot/*${flash}*.dtb /tmp/sdk/$$/"
  214. execute "cp -r $sdkdir/boot/zImage /tmp/sdk/$$/"
  215. #execute "cp $sdkdir/boot/alientek.bmp /tmp/sdk/$$/"
  216. sync
  217. echo "复制设备树与内核到${device}1完成!"
  218. if [ "$copy" != "" ]; then
  219. echo "Copying additional file(s) on ${device}p1"
  220. execute "cp -r $copy /tmp/sdk/$$"
  221. fi
  222. echo "卸载${device}1"
  223. execute "umount /tmp/sdk/$$"
  224. sleep 1
  225. #解压文件系统到文件系统分区
  226. #挂载文件系统分区
  227. execute "mkdir -p /tmp/sdk/$$"
  228. execute "mount ${device}2 /tmp/sdk/$$"
  229. echo "正在解压文件系统到${device}2 ,请稍候..."
  230. rootfs=`ls -1 filesystem/ *.tar.*`
  231. execute "tar jxfm $rootfs -C /tmp/sdk/$$"
  232. sync
  233. echo "解压文件系统到${device}2完成!"
  234. #判断是否存在这个目录,如果不存在就为文件系统创建一个modules目录
  235. if [ ! -e "${device}p2/lib/modules/" ];then
  236. mkdir -p ${device}p2/lib/modules/
  237. fi
  238. #echo "正在解压模块到${device}2/lib/modules/ ,请稍候..."
  239. #modules=`ls -1 modules/ *.tar.*`
  240. #execute "tar jxfm $modules -C /tmp/sdk/$$/lib/modules/"
  241. #sync
  242. #echo "解压模块到${device}2/lib/modules/完成!"
  243. echo "卸载${device}2"
  244. execute "umount /tmp/sdk/$$"
  245. execute "rm -rf /tmp/sdk/$$"
  246. sync
  247. echo "SD卡启动系统烧写完成!"

定时清空文件内容,定时记录文件大小 

  1. #!/bin/bash
  2. ################################################################
  3. #每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内
  4. #容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件
  5. ################################################################
  6. logfile=/tmp/`date +%H-%F`.log
  7. n=`date +%H`
  8. if [ $n -eq 00 ] || [ $n -eq 12 ]
  9. then
  10. #通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作
  11. for i in `find /data/log/ -type f`
  12. do
  13. true > $i
  14. done
  15. else
  16. for i in `find /data/log/ -type f`
  17. do
  18. du -sh $i >> $logfile
  19. done
  20. fi

从 FTP 服务器下载文件

  1. #!/bin/bash
  2. if [ $# -ne 1 ]; then
  3. echo "Usage: $0 filename"
  4. fi
  5. dir=$(dirname $1)
  6. file=$(basename $1)
  7. ftp -n -v << EOF # -n 自动登录
  8. open 192.168.1.10 # ftp服务器
  9. user admin password
  10. binary # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误
  11. cd $dir
  12. get "$file"
  13. EOF

扫描主机端口状态

  1. #!/bin/bash
  2. HOST=$1
  3. PORT="22 25 80 8080"
  4. for PORT in $PORT; do
  5. if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then
  6. echo "$PORT open"
  7. else
  8. echo "$PORT close"
  9. fi
  10. done

引用

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/639445
推荐阅读
相关标签
  

闽ICP备14008679号