奈何公司测试组电脑没有Linux系统,每次测试FOTA升级用的差分包都须要找我来制做,实在麻烦。本想搞个QT界面弄得专业点,后面有时间再去搞吧,如今打算先临时写一个应急。 html
参考以前搭建的记录 Ubuntu14.04搭建FTP服务器记录 - chenwr2018的博客 - CSDN博客 blog.csdn.net/chenwr2018/…java
由于还没实现多人同时制做差分包的功能,为了保证编译过程当中不受影响,服务端限制了客户端的链接数。 保证当前服务器只有一个IP链接,而且一个IP只有2个客户端链接数,一个用来上传文件,一个用来下载。 只需在vsftpd.conf中添加以下内容,重启服务便可。linux
max_clients=2shell
max_per_ip=1ubuntu
Inotify 是一个 Linux特性,它监控文件系统操做,好比读取、写入和建立。Inotify 反应灵敏,用法很是简单,而且比 cron 任务的繁忙轮询高效得多。windows
inotify C接口使用办法,参考以下博客:bash
linux inotify功能和用法 - Android 系统&&驱动开发 - CSDN博客 blog.csdn.net/u013377887/…服务器
sudo apt-get install inotify-toolsapp
inotifywait异步
语法:
inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
参数:
-h,--help
输出帮助信息
@
排除不须要监视的文件,能够是相对路径,也能够是绝对路径。
--fromfile
从文件读取须要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, --monitor
接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后当即退出。
-d, --daemon
跟--monitor同样,除了是在后台运行,须要指定--outfile把事情输出到一个文件。也意味着使用了--syslog。
-o, --outfile
输出事情到一个文件而不是标准输出。
-s, --syslog
输出错误信息到系统日志
-r, --recursive
监视一个目录下的全部子目录。
-q, --quiet
指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
--exclude
正则匹配须要排除的文件,大小写敏感。
--excludei
正则匹配须要排除的文件,忽略大小写。
-t , --timeout
设置超时时间,若是为0,则无限期地执行下去。
-e , --event
指定监视的事件。
-c, --csv
输出csv格式。
--timefmt
指定时间格式,用于--format选项中的%T格式。
--format
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X"分隔 %T 使用由--timefmt定义的时间格式 复制代码
inotifywatch
语法:
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
参数:
-h, --help
输出帮助信息
-v, --verbose
输出详细信息
@
排除不须要监视的文件,能够是相对路径,也能够是绝对路径。
--fromfile
从文件读取须要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z, --zero
输出表格的行和列,即便元素为空
--exclude
正则匹配须要排除的文件,大小写敏感。
--excludei
正则匹配须要排除的文件,忽略大小写。
-r, --recursive
监视一个目录下的全部子目录。
-t , --timeout
设置超时时间
-e , --event
只监听指定的事件。
-a , --ascending
以指定事件升序排列。
-d , --descending
以指定事件降序排列。
可监听事件
access 文件读取
modify 文件更改。
attrib 文件属性更改,如权限,时间戳等。
close_write 以可写模式打开的文件被关闭,不表明此文件必定已经写入数据。
close_nowrite 以只读模式打开的文件被关闭。
close 文件被关闭,无论它是如何打开的。
open 文件打开。
moved_to 一个文件或目录移动到监听的目录,即便是在同一目录内移动,此事件也触发。
moved_from 一个文件或目录移出监听的目录,即便是在同一目录内移动,此事件也触发。
move 包括moved_to和 moved_from
move_self 文件或目录被移除,以后再也不监听此文件或目录。
create 文件或目录建立
delete 文件或目录删除
delete_self 文件或目录移除,以后再也不监听此文件或目录
unmount 文件系统取消挂载,以后再也不监听此文件系统。
复制代码
Ubuntu端
root@chenwr-pc:/home# inotifywait -rm /home/workspace/project/Build_FOTA/EC20-delta-gentools
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v1/ OPEN 666
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v1/ MODIFY 666
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v1/ MODIFY 666
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v1/ CLOSE_WRITE,CLOSE 666
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ OPEN 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ CLOSE_WRITE,CLOSE 233
复制代码
PC端
发送文件至Ubuntu端FTP服务器
E:\windows_to_linux_FTP
ftp> open 192.168.1.35
链接到 192.168.1.35。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
ftp> user FTP
331 Please specify the password.
230 Login successful.
ftp> put 1.zip /home/workspace/project/Build_FOTA/EC20-delta-gentools/v1/666
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 252 字节,用时 0.00秒 252000.00千字节/秒。
ftp> put 1.zip /home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/233
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 252 字节,用时 0.00秒 252.00千字节/秒。
ftp>
复制代码
保存日志
inotifywait -rm /home/workspace/project/Build_FOTA/EC20-delta-gentools | tee /var/log/ftp_message
后续直接经过管道来逐行读取就好,就不必写到文件中。主要目的是判断FTP接受文件完毕。
个别电脑运行的时候会出现
find %ftplog% "Failed to establish connection" > C:\null 重定向到C盘致使 能够修改成其余盘符,好比find %ftplog% "Failed to establish connection" > E:\null
使用该监控文件变化会出现一个问题,PC端FTP传输数据都是小块小块的传输
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ MODIFY 233
/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ CLOSE_WRITE,CLOSE 233
复制代码
因此脚本执行的条件仍是判断关键语句吧 /home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ CLOSE_WRITE
测试代码: auto_build_fota.sh
#!/bin/sh
sleep 5 # wait server start
BUILD_FOTA="/home/workspace/project/Build_FOTA/EC20-delta-gentools"
SCRIPT="./update_gen.sh a"
content1="/home/workspace/project/Build_FOTA/EC20-delta-gentools/v1/ CLOSE_WRITE,CLOSE targetfiles.zip"
content2="/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ CLOSE_WRITE,CLOSE targetfiles.zip"
flag=0;
log=$BUILD_FOTA/log
echo "start auto build fota script" > $log
/usr/bin/inotifywait -rm $BUILD_FOTA \
| while read line
do
if [ "$line" = "$content1" ]; then
echo $(date)
echo $line >> $log
echo "recv targetfiles.zip suc from client pc" >> $log
flag=1
fi
if [ "$line" = "$content2" ] && [ $flag = 1 ] ; then
flag=0
echo $line >> $log
cd $BUILD_FOTA
echo "cur path $(pwd)" >> $log
echo "start build time: $(date)" >> $log
$SCRIPT 2>&1 | tee -a $log
if [ $? != 0 ]; then
echo "Build Script run failded!" >> $log
else
echo "Build Script run success!" >> $log
echo "Build end time: $(date)" >> $log
cp $BUILD_FOTA/mainapp* $BUILD_FOTA/bak
echo "60 sec after to delete mainapp_fota" >> $log
sleep 60
rm -f $BUILD_FOTA/mainapp*
if [ $? != 0 ]; then
echo "mainapp delete failed" >> $log
else
echo "mainapp delete success" >> $log
fi
fi
fi
done
复制代码
/usr/bin/inotifywait -rm $BUILD_FOTA | while read line 逐行读取监控目录的信息,一旦有新文件产生会有信息产生。经过判断关键语句/home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/ CLOSE_WRITE,得出该文件FTP传输结束,紧接着触发编译脚本。
设置该脚本开机自启 简单在/etc/rc.local文件中添加要启动的脚本
@echo off
title mainapp_fota差分包编译工具
mode con lines=20 cols=55
color 3f
echo.
echo 请不要关闭此窗口,耐心等待!!!
echo.
set file1=1.zip
set file2=2.zip
set ftplog=ftp_log
set ftpfilename=ftp.cfg
set b=%cd%
echo %b%
if exist %file1% (
if exist %file2% (
echo 文件上传中......
goto ftp_upload
) else (
echo %file2% is not exist!
pause
exit
)
) else (
echo %file1% is not exist!
pause
exit
)
:ftp_upload
echo open 192.168.1.35>"%ftpfilename%"
echo user ftp>>"%ftpfilename%"
echo 123456>>"%ftpfilename%"
echo.>>"%ftpfilename%"
echo put %file1% /home/workspace/project/Build_FOTA/EC20-delta-gentools/v1/targetfiles.zip>>"%ftpfilename%"
echo put %file2% /home/workspace/project/Build_FOTA/EC20-delta-gentools/v2/targetfiles.zip>>"%ftpfilename%"
echo bye >>"%ftpfilename%"
ftp -n -s:"%ftpfilename%" >"%ftplog%"
del "%ftpfilename%"
find %ftplog% "Failed to establish connection" > E:\null
if "%errorlevel%"=="0" (
goto firewall_error
) else (
echo targetfiles.zip 文件上传成功!
echo.
goto progress_bar_compile
pause
)
goto:eof
:ftp_download
echo open 192.168.1.35>"%ftpfilename%"
echo user ftp>>"%ftpfilename%"
echo 123456>>"%ftpfilename%"
echo.>>"%ftpfilename%"
echo mget /home/workspace/project/Build_FOTA/EC20-delta-gentools/mainapp* >>"%ftpfilename%"
echo.>>"%ftpfilename%"
echo bye >>"%ftpfilename%"
ftp -n -s:"%ftpfilename%" >>"%ftplog%"
del "%ftpfilename%"
find %ftplog% "mainapp_" > C:\null
IF ERRORLEVEL 1 goto download_error
echo mainapp_fota 文件下载成功!
pause
goto:eof
:progress_bar_compile
cls
set a=^set /p=■^<nul^&ping/n 2 127.1^>nul^&
echo.
echo 正在编译中......
echo.
echo ┌──────────────────────────────────────┐
set/p=  <nul&%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%
echo 100%%
echo └──────────────────────────────────────┘
echo 编译成功!!!
goto ftp_download
pause
goto:eof
:upload_error
echo 文件上传失败
pause
goto:eof
:firewall_error
echo 请关闭windows防火墙后,从新运行脚本。
pause
goto:eof
:download_error
echo 获取mainapp_fota失败,请从新运行脚本。
pause
goto:eof
echo.
pause
复制代码
1.mode con lines=20 cols=55 是设置你批处理运行时窗口大小的
2.使用了 @echo off 以后就无需再用 @;命令前加@符号,表示不显示@后面的命令。举一个不和谐的例子:在入侵过程当中(使用批处理来格式化敌人的硬盘)天然不能让对方看到你使用的命令啦。
3.FTP参数说明
FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-x:sendbuffer] [-r:recvbuffer] [-b:asyncbuffers] [-w:windowsize] [host]
-v 禁止显示远程服务器响应。
-n 禁止在初始链接时自动登陆。
-i 关闭多文件传输过程当中的
交互式提示。
-d 启用调试。
-g 禁用文件名通配(请参阅 GLOB 命令)。
-s:filename 指定包含 FTP 命令的文本文件;命令
在 FTP 启动后自动运行。
-a 在绑字数据链接时使用全部本地接口。
-A 匿名登陆。
-x:send sockbuf 覆盖默认的 SO_SNDBUF 大小 8192。
-r:recv sockbuf 覆盖默认的 SO_RCVBUF 大小 8192。
-b:async count 覆盖默认的异步计数 3
-w:windowsize 覆盖默认的传输缓冲区大小 65535。
host 指定主机名称或要链接到的远程主机
的 IP 地址。
注意:
- mget 和 mput 命令将 y/n/q 视为 yes/no/quit。
- 使用 Ctrl-C 停止命令。
复制代码
将FTP相关ip密码等信息写入文件中,再经过-s参数去实现命令自动运行。
4.echo.为换行,因mget会能够模糊从FTP服务器上传输文件,若是FTP服务器存在多个前缀相同的文件时此时就须要回车来确认,所以须要记得mget语句写入文件后再增长个echo.
5.程序返回码 echo %errorlevel% 每一个命令运行结束,能够用这个命令行格式查看返回码 用于判断刚才的命令是否执行成功 默认值为0,通常命令执行出错会设 errorlevel 为1 if "%errorlevel%"=="0" ( goto firewall_error ) else ( echo No Run )
6.bat乱码问题,在文件右键用“编辑”打开, 另存为时,UTF-8保存为ANSI格式。便可解决运行是乱码问题。
7.pc端将FTP运行结果保存到文件中,可经过对文件的关键字来判断FTP的运行状态。
SET file1=1.zip
SET file2=2.zip
echo 文件上传中......
set b=%cd%
echo %b%
if exist %file1% (
echo %file1% is exist!
) else (
echo %file1% is not exist!
)
if exist %file2% (
echo %file2% is exist!
) else (
echo %file2% is not exist!
)
复制代码
bat 脚本之 使用函数 - caopeng的专栏 - CSDN博客 blog.csdn.net/peng_cao/ar…
格式 :func 函数内部动做 goto:eof
实例
@echo off
@title copy sth to current filepath
mode con lines=5 cols=40
SET SourceFile=1.zip
SET GenFile1=2.zip
if exist %SourceFile% (
if not exist %GenFile1% (
echo %GenFile1% is no exist!
call:hello
) else (
echo %GenFile1% is exist!
)
) else (
echo %SourceFile% is not exist!
)
:hello
echo hello world
pause
goto:eof
echo Success
ping -n 3 127.0.0.1 > nul
pause
复制代码
使用call会继续执行一次函数,goto就不会。
指定次数循环 FOR /L %variable IN (start,step,end) DO command [command-parameters] 组合命令: FOR /L %variable IN (start,step,end) DO ( Command1 Command2 …… )
(如今还不清楚进度条如何同步,正在编译的状态暂时按照时间来计时。)
@echo off
cls
set a=^set /p=■^<nul^&ping/n 1 127.1^>nul^&
echo.
echo 正在编译中......
echo.
echo ┌──────────────────────────────────────┐
:cycle
for %%i in (■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■) do (set/p=<nul&%a% goto jindu)
goto:eof
echo 100%%
echo └──────────────────────────────────────┘
echo 编译成功!!!
pause
:jindu
goto cycle
goto:eof
复制代码
bat批处理修改cmd窗口大小、标题、字体、背景颜色 - zj0910 - CSDN博客 blog.csdn.net/zj0910/arti…
.bat文件中call命令的用法 - 村长 - CSDN博客 blog.csdn.net/a_little_a_…
在程序里调用ftp批处理(sh)上传文件,如何判断文件已成功上传-CSDN论坛 bbs.csdn.net/topics/8045…
利用windows系统ftp命令编写的BAT文件上传[转] - 风之语 - BlogJava www.blogjava.net/gf7/archive…
FTP返回值详解 - pgmsoul的专栏 - CSDN博客 blog.csdn.net/pgmsoul/art…
[转]Bat脚本处理ftp超强案例解说 - 是谁啊? - 博客园 www.cnblogs.com/hanxianlong…
bat命令入门与高级技巧详解_DOS/BAT_脚本之家 www.jb51.net/article/972…
inotify-tools使用方法介绍 - wangkangluo1 - 博客园 www.cnblogs.com/wangkangluo…
Linux下的文件更新触发同步 - kenyon的我的页面 - OSCHINA my.oschina.net/Kenyon/blog…
FTP命令详解(含操做实例) - IndexMan的专栏 - CSDN博客 blog.csdn.net/indexman/ar…
mget命令, ftp命令详解 - wajika - 博客园 www.cnblogs.com/wajika/p/64…