考虑以下命令:
while true; do echo 'Hit CTRL+C';sleep 1;done >> `date +"%H%M.txt"`
当我执行此命令时,它将输出重定向到单个文件,文件名作为命令的开始时间。如何更改此设置,以便每分钟使用文件名
保存到其他文件 date +"%H%M.txt"
在那一分钟?
编辑:
while true; do echo 'Hit CTRL+C';sleep 1;done
只是一个可以运行很长时间并且每秒输出一些数据的程序的替代品。我希望将每分钟输出的数据保存到一个单独的文件中,而不必重新启动我的程序。
答案 0 :(得分:0)
您需要在每个循环实例上重新评估日期。
while true; do echo 'Hit CTRL+C' > "`date +"%H%M"`.txt"; sleep 1; done
答案 1 :(得分:0)
#!/bin/bash
while true ; do
echo 'Hit CTRL+C' # just for the screen
stock=$( date +"%H%M" )
while [[ $( date +"%H%M" ) == $stock ]] ; do
echo 'Hit CTRL+C' $stock
sleep 1
done > "$stock.txt" # no need '>>'
done
关于每分钟的磁盘访问
答案 2 :(得分:0)
长时间运行命令的输出应重定向到中间位置(fifo
),然后使用cat
在每分钟从此fifo中将日志记录到不同的文件中。
这是一个简单的脚本包装器,使用SIGUSR1
更新日志文件名。用你的命令替换long-running-cmd
。
# in seconds
logger_update_duration=60
background_pid=
main_cmd=
function update_file_name() {
trap "update_file_name" USR1 # re-establish
file_name=$(date +"%Y-%m-%d-%H-%M-%S.log")
echo "update file name $file_name"
cat < ./logger > $file_name &
# after establish the new, check should kill the old
if [ x$background_pid != x ];then
echo "will kill the old $background_pid current is $$"
kill -TERM $background_pid
fi
background_pid=$!
}
trap "update_file_name" USR1
function clean() {
echo "perform clean..."
kill -TERM $!
kill -TERM $main_cmd
rm logger
}
trap "clean" EXIT
# create logger fifo
[ ! -p logger ] && mkfifo logger
# replace with your long time running operation
./long-running-cmd > ./logger &
main_cmd=$!
while true
do
kill -USR1 $$
sleep ${logger_update_duration}
done
long-running-cmd
的输出应在一分钟内分成不同的日志文件。