我使用 Linux 命令行,但我还是个新手。我创建了两个文件,test.sh
和test.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/
希望这有帮助:)