免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 14519 | 回复: 23
打印 上一主题 下一主题

帮个忙,怎么自动检测文件更新,并做打印 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-21 22:30 |只看该作者 |倒序浏览
比如一个"程序1"创建的file1.txt,file2.txt,file3.txt....和日志prt.log
prt.log里面的日志内容是
file1.txt
file2.txt
file3.txt
程序1给日志文件增加记录
file4.txt

能不能做到每隔1分 "程序2"自动检测日志文件prt.log的更新,如果有更新就启动打印函数prtfile1() 送到打印机
prtfile1 file4.txt

我现在不知道怎么做的地方就是怎么做到每隔1分钟自动检测日志文件prt.log
我的环境sco unix 5.05 /bin/ksh

[ 本帖最后由 liujuejun 于 2008-3-21 22:37 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-03-21 22:57 |只看该作者
用cron每一分钟执行一次

论坛徽章:
0
3 [报告]
发表于 2008-03-22 09:37 |只看该作者
给个思路:

  1. startlines=1
  2. while [ true ]
  3. do
  4.     endline=`wc -l < prt.log`
  5.     sed -n "${startline},${endline}p" | while read file;do prtfile1 "$file";done
  6.     startline=`expr $endline + 1`
  7.     sleep 60
  8. done
复制代码

sleep 60 是等待60秒,如果需要考虑脚本运行的时间,就需要做进一步的处理,比如开始处理的时候记录下时间  date +%s ,代码段运行后,再记录下时间 date +%s,然后sleep的时候,考虑这两个时间的差值,并把这个差值减去。

论坛徽章:
0
4 [报告]
发表于 2008-03-22 13:30 |只看该作者
原帖由 springwind426 于 2008-3-22 09:37 发表
给个思路:

startlines=1
while [ true ]
do
    endline=`wc -l < prt.log`
    sed -n "${startline},${endline}p" | while read file;do prtfile1 "$file";done
    startline=`expr $endline + 1`
...

我们单位发农民粮食补贴,我设计一个程序让工资报表自动备份然后打印,要打印很多文件报表,上次发补贴我打印那些报表就用了两个星期.
如果打印的文件file4.txt特别大,需要很长时间,假如是几十分钟,再没有打完的情况下,prt.log又有新的记录file5.txt,打印会不会出问题.
我的打印函数如下
prt()
{
_PRTFILE=$1
echo ""
cat $_PRTFILE
echo ""
}
#打印到终端
prtfile1()
{
_PRTFILE1=$1 #打印文件
_MYTTY=$2 #终端端口
if [ "$_MYTTY" != "" -a -f "$_PRTFILE1" ];then
prt ${_PRTFILE1} >${_MYTTY} &
else
echo "要打印的文件不存在,或者端口不存在"
fi
}
我怕打印出问题就创建两个文件now.log 和over.log
now.log 记录正在打印的文件,当now.log 不为空时打印不启动,为空打印启动
over.log 记录已经打印完成的文件
这两个文件有必要做吗?

[ 本帖最后由 liujuejun 于 2008-3-22 13:33 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2008-03-22 14:11 |只看该作者
用tail -f 读打印列表不就行了

论坛徽章:
0
6 [报告]
发表于 2008-03-22 17:18 |只看该作者
原帖由 waker 于 2008-3-22 14:11 发表
用tail -f 读打印列表不就行了



是啊,还是版主灵光!

论坛徽章:
0
7 [报告]
发表于 2008-03-22 21:13 |只看该作者
tail -f  会不会漏掉要打印的文件,最后10行,10个文件一起打印吗?
又增加2个文件,会不会前面打印过的8个文件又重复打印.

[ 本帖最后由 liujuejun 于 2008-3-22 21:36 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-03-22 22:15 |只看该作者
试试看这个方法

  1. #!/bin/bash
  2. PRTCNTS=1000         # 印印资料的总份数
  3. PRTDEV="/dev/lp0"   # 打印机装置
  4. prt() {
  5.    echo ""
  6.    cat $1
  7.    echo ""
  8. }

  9. for CNT in `seq $PRTCNTS`; do
  10.    until [ -e "file${CNT}.txt" ]; do
  11.       sleep 60
  12.    done
  13.    echo "开始打印 file${CNT}.txt "
  14.    prt  file${CNT}.txt > $PRTDEV &
  15. done
复制代码

论坛徽章:
0
9 [报告]
发表于 2008-03-22 22:32 |只看该作者
突然想到另一種方式


  1. #!/bin/bash
  2. PRTDEV="/dev/lp0"   # 打印机装置
  3. prt() {
  4.    echo ""
  5.    cat $1
  6.    echo ""
  7. }

  8. CNT=1               # 打印文件启始值
  9. while :; do
  10.    until [ -e "file${CNT}.txt" ]; do
  11.       sleep 60
  12.    done
  13.    echo "开始打印 file${CNT}.txt "
  14.    prt  file${CNT}.txt > $PRTDEV &
  15.    CNT=$(expr $CNT + 1)
  16. done
复制代码

论坛徽章:
0
10 [报告]
发表于 2008-03-23 01:17 |只看该作者
着重看下最底下绿色部分,是我自己的解决方法,不知道可不可以.给点意见,我的方法是把备份的打印文件分成全部打印队列,已经打印队列,正在打印的文件,我的程序还没有测试,在家的windowsxp 自己写的,星期一上班再去测试


#打印程序
trap "" 2 3 15
HOLD1=tmp/HOLD1.$$
HOLD2=tmp/HOLD2.$$
HOLD3=tmp/HOLD3.$$
HOLD4=tmp/HOLD4.$$
DWFILE=dfgz/DWFILE.INI #单位信息 记录1,单位编号 2,单位名称 3. 局所号
PRTNOW=dfgz/prtnow.log #正在打印的文件 记录1.终端端口号 2单位编号 3.正在打印的文件名
PRTOVER=dfgz/prtover.log #已经打印完的文件 1.打印文件名 2.单位编号 3.终端端口号
PRTLIST=dfgz/PRTLIST.log #所有打印文件
PRTTTY=dfgz/prttty.log #终端端口号,多终端打印

if [ ! -d "backup" ];then
mkdir backup
fi
if [ ! -d "dfgz" ];then
mkdir dfgz
fi
if [ ! -f $DWFILE ];then
>$DWFILE
fi
if [ ! -f $PRTLIST ];then
>$PRTLIST
fi
if [ ! -f $PRTNOW ];then
>$PRTNOW
fi
if [ ! -f $PRTOVER ];then
>$PRTOVER
fi
if [ ! -f $PRTTTY ];then
>$PRTTTY
fi

#数据录入
#1.名称2.长度(汉字随便但必须要输)3.number数字/chinachar汉字4.null可空/no不可空5.提示信息
null_rec()
{
_XSTR=$1
_NLEN=$2
_CHARORNUM=$3
_SNULL=$4
_MSG=$5
_RSTR=""
while :
do
if [ "$Q_FLAG" = "0" ];then
break
fi
clear
dispaly_rec
echo  "$_MSG"
echo  "请输入${_XSTR}为${_NLEN}位数字或者输入q退出:"
echo -n "\n请输入${_XSTR}为${_NLEN}位数字:"
read _RSTR
if q_quit $_RSTR
then
Q_FLAG=0
_RSTR=""
break
else
Q_FLAG=1
fi
if [ "$_RSTR" != "" ];then
        if a_number $_RSTR;then
        CZH_PASS=0
        else
        CZH_PASS=1
        fi
        if length_check $_RSTR $_NLEN;then
        CZH_LEN=0
        else
        CZH_LEN=1
        fi
        if characters $_RSTR;then
        CZH_CHAR=0
        else
        CZH_CHAR=1
        fi
        if [ "$_CHARORNUM" = "number" ];then
                if [ "$CZH_LEN" = "0" -a "$CZH_PASS" = "0" ]
                then
                break
                else
                echo "${_XSTR}必须为${_NLEN}位数字,不能含有字母"
                echo "${_XSTR}输入错误。"
                continue_prompt
                fi
        fi
                if [ "$_CHARORNUM" = "chinachar" ];then
                if [ "$CZH_CHAR" = "0" ]
                then
                break
                else
                H_NLEN=`echo $_NLEN%2|bc`
                echo "${_XSTR}必须为汉字"
                echo "${_XSTR}输入错误。"
                continue_prompt
                fi
                fi
else
if [ "$_SNULL" = "null" ];then
break
fi
if [ "$_SNULL" = "no" ];then
echo "${_XSTR}不能为空"
continue_prompt
fi
fi
done
}

#检测字长
length_check()
{
_STR=$1
_MAX=$2
_LENGTH=`echo $_STR|awk '{print length($0)}'`
if [ "$_LENGTH" -ne "$_MAX" ];then
        return 1
else
        return 0
fi
}
#检测是否为数字
a_number()
{
_NUM=$1
_NUM=`echo $1|awk '{if($0~/[^0-9]/) print "1"}'`
if [ "$_NUM" != "" ]
then
        return 1
else
        return 0
fi
}
#检测是否为字符型
characters()
{
_LETTERS_ONLY=$1
_LETTERS_ONLY=`echo $1|awk '{if($0~/[^a-zA-Z0-9]/) print "1"}'`
if [ "$_LETTERS_ONLY" != "" ]
then
        return 1
else
        return 0
fi
}

#检测记录唯一性
check_duplicate()
{
_CODE=$1
_DFILE=$2
MATCH=`grep "^$_CODE" $_DFILE`
#echo $_CODE
if [ "$MATCH" = "" ];then
        return 0
else
        return 1
fi
}
#拷贝文件
cpfile()
{
_CSFILE=$1
_CDFILE=$2
if [ -f $_MSFILE ];then
cp $_CSFILE $_CDFILE
return 0
fi
}
#正在打印读写权利
now_list()
{
_FLAGNOW=$1
_BACK_FILE=$2
if [ "_FLAGNOW" = "w" ];then
   printf "$IS_TTY\t$_BACK_FILE\t$DWBH\n" >>$PRTNOW
   return 1
  else
   if [ "$_FLAGNOW" = "r" ];then
   NOW_FLAGR=`grep "$_BACK_FILE" $PRTNOW`
    if [ "$NOW_FLAGR" != "" ]
        then
       return 1
        else
       return 0
    fi
        fi
fi
}

#已经打印读写权利
over_list()
{
_FLAGOVER=$1
_BACK_FILE2=$2
if [ "$_FLAGOVER" = "w" ];then
   printf "$_BACK_FILE2\t$DWBH\t$IS_TTY\n" >>$PRTOVER
   grep -v "^$IS_TTY" $PRTNOW >>$HOLD2
   mv $HOLD2 $_NOWLIST
    return 1
else
   if [ "$_FLAGOVER" = "r" ];then
         OVER_FLAGR=`grep "$_BACK_FILE2" $PRTOVER`
    if [ "$OVER_FLAGR" != "" ];then
    return 1
                else
    return 0
    fi
                fi
fi
}
#打印功能
prtfile()
{
_PRTFILE=$1
echo ""
cat $_PRTFILE
echo ""
}


#打印到终端
prttty()
{
_PRTFILE2=$1
_MYTTY=$2
now_list w $_PRTFILE2
if [ "$_MYTTY" != "" -a -f "$_PRTFILE2" ];then
prtfile ${_PRTFILE2} >${_MYTTY}
over_list w $_PRTFILE2
else
echo "要打印的文件不存在,或者端口不存在"
fi
}
#文件是否相同
diffile()
{
_DIFFILE1=$1
_DIFFILE2=$2
if [ -f "$_DIFFILE1" -a -f "$_DIFFILE2" ];then
diff ${_DIFFILE1} ${_DIFFILE2} >$HOLD1
if [ $? -ne 0 ];then
return 0
else
return 1
fi
fi
}
#备份文件并打印文件
reportbackup()
{
null_rec "单位编号" 8 number no "请输入单位编号,输入q退出"
DWBH=$_RSTR
if ! check_duplicate $DWBH $DWFILE;then
REORTFILE=/mid_SYS/run/tmp/rpt${DWBH}#需要备份的文件
whlie :
do
LASTFILE=`awk '{if($2=='$DWHB') print $0}' $PRTLIST|tail -1|awk '{print $1}'`#最后一个文件
if diffile $REORTFILE $LASTFILE;then #比较两个文件
PRTNUM=`awk '{if($2=='$DWHB') print $0}' $PRTLIST|wc -l`
PRTNUM=`expr $PRTNUM + 1 `
PRTNUM=`expr $RPTNUM + 1000 `
BACKUPFILE=backup/prt${DWBH}${PRTNUM}
cpfile $REORTFILE $BACKUPFILE
printf "$BACKUPFILE\t$DWBH\n" >>$PRTLIST
PRTLIST_FILE='awk '{printf $1}$PRTLIST`
TTY_LIST='awk '{printf $1}$PRTTTY`
for $PRT_FIIE in $PRTFILE_FILE
do
if now_list r $PRT_FILE;then
NOW_FLAG=0
else
NOW_FLAG=1
fi
if over_list r $PRT_FILE;then
OVER_FLAG=0
else
OVER_FLAG=1
fi
if [ "$NOW_FLAG" = "0" -a "$OVER_FLAG" = "0" ];then
for IS_TTY in $TTY_LIST
do
if check_duplicate $IS_TTY $PRTNOW;then
prttty $PRT_FILE $IS_TTY &
else
echo "\n所有打印机忙,无法打印"
fi
echo  "等待60秒继续监测文件"
sleep 60
done
done
fi
done
else
echo "\n你输入单位编号不存在\n"
fi

}


[ 本帖最后由 liujuejun 于 2008-3-23 10:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP