【问题标题】:Shell scripting while loopShell 脚本 while 循环
【发布时间】:2014-05-29 06:44:26
【问题描述】:
 #!/bin/sh
   export TERM=linux
   start()
   {
   logger "starting logs..."
   NOW=$(date +"%F")
   FILE="log-$NOW"
   sh -ci "myapp -w /opt/home/logs/$FILE &> /dev/tty${#} &" >> /dev/null
   wait
   logger "myapp started"
   }

   stop()
   {
   kill -9 $(pidof myapp)
   }
   CDAY=$(date +"%d")
   start
   while [1]; do
        if [ $CDAY -ne $(date +"%d") ]
        then
                logger "loop"
                CDAY=$(date +"%d")
                stop; start
        fi
   done

接下来的逻辑是: myapp 开始记录一些进程 如果当前日期已更改(第二天),脚本将停止 myapp 并再次启动它以创建新的日志文件

我是 shell 脚本的新手,但它不能像假设的那样工作,我哪里错了?

UPD:似乎while循环不起作用,脚本没有进入,logread中没有logger "loop"

UPDD:完成 将 while 循环的语法更正为 while : 它开始工作。 谢谢大家!

【问题讨论】:

  • 请描述您的脚本如何无法正常工作。
  • 我想你忘记了 $: /dev/tty${#} 假设你想要传递的参数数量。
  • @gareth_bowles 我昨天开始了它,并假设今天我将看到 5 月 28 日和 29 日的 2 个日志文件。但我只看到 28 日的日志文件,myapp 正在继续写入其中
  • @RedX thx,会更正它
  • 既然你想要一个数字匹配,你应该做(( $CDAY != $(date +"%d") )),为了更好的风格,一个名为 stop 的函数也不应该启动。要么重命名为restart,要么在while循环中使用stop; start

标签: linux bash shell logging


【解决方案1】:

我在黑暗中的狂野刺伤是删除最后一行的fi,因为它似乎没有匹配的if您可能会从添加@中受益987654323@ 左右到您的 while 循环,否则您将浪费 CPU 时间尽可能快地完成它而几乎没有上升空间。错误可能与if [ $CDAY !=$(date +"%d") ] 有关,我相信您必须在运算符的任一侧都有一个空格,如下所示:if [ $CDAY != $(date +"%d") ]。由于您正在进行整数比较,您可能还应该将运算符更改为-ne,因为!= 用于字符串比较。我建议将%d 更改为%M,以便它能够更快地翻转,这有利于确保它正常工作。 (%F 还需要更改为更具体的内容,例如 %c)。

【讨论】:

  • 最后一行'fi'是从putty复制它的错误,在真正的脚本中它不存在,抱歉。感谢您提示“睡眠 120”
  • 在文件创建中更改为if (( $CDAY -ne $(date +"%M") )),也更改为“%M”,但没有运气。它创建一个文件并将所有数据写入其中
  • 尝试使用(( $CDAY != $(date +"%M") ))[ $CDAY -ne $(date +"%M") ]
  • 启动 myapp 创建脚本 echo $(pidof myapp) 并且脚本没有回显
猜你喜欢
  • 1970-01-01
  • 2017-09-20
  • 2019-12-10
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2017-11-13
相关资源
最近更新 更多