如何在linux中自动运行脚本?

如何在linux中自动运行脚本?

我使用 Linux 命令行,但我还是个新手。我创建了两个文件,test.shtest.log。该过程是任何输出都转到test.log,我成功地获得了输出test.log。我想每 5 秒自动运行一个脚本,并且仅在文件发生任何更改时才写入.sh

test.sh包含:

#!/bin/bash
while [ true ] ;
do
echo "" date and Time >> test.log
date +%x_r >> test.log
lsusb >> test.log

sleep 5;
done

我的问题:有什么方法可以自动运行它并仅将新更改与新日期一起附加到文件中?例如,如果有人将 USB 设备插入我的机器,它会将新日期附加到现有的日志文件中。

答案1

这应该可以工作,它将最后的输出存储lsusb在 $lastoutput 中,如果它们不相等则附加

#!/bin/bash
while [ true ] 
do
    currentoutput="$(lsusb)"
    if [ "$currentoutput" != "$lastoutput" ]
    then
        echo "" date and Time >> test.log
        date +%x_r >> test.log
        lastoutput="$(lsusb)"
        lsusb >> test.log
    fi
    sleep 5
done

答案2

lsusb您可以diff只输出更改部分,而不必总是记录整个输出。

#!/bin/bash

logfile="test.log"
lsusbout_before=

while sleep 1; do
    lsusbout_now="$(lsusb)"
    diff=$(diff <(printf '%s\n' "$lsusbout_before") <(printf '%s\n' "$lsusbout_now"))
    if [ $? = 1 ]; then
        date | tee -a "$logfile"
        printf '%s\n' "$diff" | grep '^[<>]' | tee -a "$logfile"
        lsusbout_before="$lsusbout_now"
    fi
done

每当添加某些内容时,diff都会输出:

> ...

如果删除了某些内容,则输出为

< ...

例如当我连接我的 USB 记忆棒时:

Fr 12. Apr 10:55:48 CEST 2019
> Bus 002 Device 014: ID 8564:1000 Transcend Information, Inc. JetFlash

如果文件不同,该脚本将使用diff错误代码。1

  • <(command)文件描述符:在内存中生成一个文件,以 的输出command作为输入,类似于$(command)
  • [ $? = 1 ]检查最后一个命令的错误代码(此处diff:)。
  • grep '^[<>]'diff是为了抑制与我们无关的类似位置变化的额外输出。

答案3

你必须:

  • 把你的文件放在/etc/init.d目录中
  • 使你的 sh 文件可执行(使用chmod +x命令)

如果它不能正常工作,请创建文件的符号链接到/etc/rc.d/

ln -s /etc/init.d/test.sh /etc/rc.d/ 

希望这有帮助:)

相关内容