exec 22>&2 21>&1 1>$log 2>&1
현재 stderr 및 stdout을 로그 파일에 쓰는 데 사용하는 bash 스크립트가 있습니다 . 각 항목에 타임스탬프를 추가하고 싶지만 그렇게 하는 쉬운 방법을 찾지 못했습니다. 이상적으로는 나머지 명령보다 먼저 같은 줄에 시간을 기록하여 현재 명령을 간단히 변경하는 것입니다.
다음은 명령을 사용하는 스크립트입니다.
#!/bin/bash
#This script takes the server to rysnc as an argument. You can also tell
#the script to check the server_status.txt file.
#
#Example: /path/to/script/sync.sh grail true
#
#The arguments are order senstive. The server name must come before the status
#check value.
#Logfile
LOG=/var/log/sync.log
DIRECTORYS="auth/ keys/ log/mailwhen/ intranet/ www/calmaa/data/ www/admatch/data/ www/sfhsa/data/ www/hfa3_org www/padmatch/ www/serverdown/"
if [ "x$2" == "xfalse" ]; then
return 0
elif [ "x$2" == "xtrue" ]; then
if [ `cat /srv/www/wan*/server_status.txt` == "primary" ]; then
exit 0
fi
else
echo "Please use \"true\" or \"false\" for the second value."
exit 1
fi
# Copy stdout and stderr, and then open the logfile
exec 22>&2 21>&1 1>$log 2>&1
# Here is how to restore stdout and stderr:
# exec 2>&22 1>&21
for DIRECTORY in $DIRECTORYS; do
rsync -azu --delete --bwlimit=500 $1:/srv/$DIRECTORY /srv/$DIRECTORY
done
답변1
귀하의 스크립트를 더 많이 보지 않고는 귀하의 특정 요구에 가장 적합한 방법을 말할 수 없습니다. 그러나 이는 귀하의 필요에 맞게 조정할 수 있는 일반적인 방법입니다.
exec > >(while read -r line; do printf '%s %s\n' "$(date --rfc-3339=seconds)" "$line"; done)
출력되는 각 텍스트 줄에는 해당 텍스트가 발생한 시간에 대한 타임스탬프가 추가됩니다. 출력은 다음과 같습니다.
2013-09-04 21:32:14-05:00 An event occurred and this is the message
2013-09-04 21:32:37-05:00 Some time passed, another event produced a message
답변2
다음을 사용하여 스트림 편집 sed
:
sed "s/^/$(date -u) /"
파이프 사용 :
[root@giomacdesk ~]# cat test.txt
asd1
asd2
[root@giomacdesk ~]# cat test.txt |sed "s/^/$(date -u) /"
ოთხ სექ 4 19:00:53 UTC 2013 asd1
ოთხ სექ 4 19:00:53 UTC 2013 asd2
[root@giomacdesk ~]#