将外壳脚本的所有命令记录到日志文件中

rsl1atfo  于 2022-10-21  发布在  Hive
关注(0)|答案(3)|浏览(228)

大家好,在谷歌搜索了几个小时后,希望这里有人能给你指路。
目前,我有一个.sh文件,我在PuTTY中运行它来启动一个进程。目前我这样做的方式是:

sh /filepath/file.sh >> /filepath/file_date.log

虽然这是可行的,但我发现要确保我调用的每个.sh文件的>>和日志文件路径正确无误是很麻烦的。
我的.sh文件的当前内容如下:


# !/bin/bash

set -x

frstdt=`date -d "last monday - 2 week" +"%m%d%Y"`;
scnddt=`date -d "last sunday - 1 week" +"%m%d%Y"`;
tday=`date -d "$date" +"%m_%d_%Y"`;
frstdtem=`date -d "last monday - 2 week" +"%m/%d/%Y"`;
scnddtem=`date -d "last sunday - 1 week" +"%m/%d/%Y"`

cd /filepath/
/filepath/cloak-hive -f query.hql

--Here I use hive -e to get some results from the query and write them to a .csv file.

ehco "Contents of email" | mailx -s "Subject" -a "Attchement" -me@email.com

我想要了解的是,我可以在.sh文件的开头添加什么内容来记录发生的所有操作,map/Reduce更新配置单元等。现在,当我在调用.sh时使用>>命令时,我可以看到所有这些,但我希望为团队中的其他人简化这一过程。我尝试过使用exec、trap、exec;|tee和其他版本,但都无法正常工作。输入sh/filepath/filename.sh之后,我不需要在控制台中看到任何内容。我只希望所有内容都显示在日志文件名中,日志文件名中包含它运行的dat(这就是我将tday作为变量的原因;我希望它显示为/filepath/filename_$tday.log

ghhaqwfi

ghhaqwfi1#

做到这一点的最好方法是:

command >> /filepath/logfile.log 2>&1

把它写进你的剧本里,
谢谢

wn9m85ua

wn9m85ua2#

使用sh运行该脚本是错误的。请参阅Difference between sh and bash
如果我没猜错您要问的问题,我的建议是创建一个简单的 Package 器,比如


# !/bin/sh

/filepath/file.sh >> /filepath/file_$(date +%F).log

您的脚本应该具有有效的shebang,并且需要chmod +xchmod +x才能使用该工具,而不是拼写shbash。然后,您也不需要跟踪哪个脚本使用哪个外壳。
我还会稍微重构一下您的Bash脚本。


# !/bin/bash

set -x

# Use modern POSIX syntax for command substitution

tday=$(date -d "$date" +"%m_%d_%Y")
frstdtem=$(date -d "last monday - 2 week" +"%m/%d/%Y")
scnddtem=$(date -d "last sunday - 1 week" +"%m/%d/%Y")

# Don't call the same date commands again; instead, just remove slashes

frstdt=${frstdtem//\//}
scnddt=$(scnddtem//\//}

# Probably avoid cd, but depends

# See https://stackoverflow.com/questions/45591428/what-exactly-is-current-working-directory

cd /filepath/
/filepath/cloak-hive -f query.hql

--Here I use hive -e to get some results from the query and write them to a .csv file.

# Don't misspell echo or Attachment

echo "Contents of email" | mailx -s "Subject" -a "Attachment" -me@example.com

使用最疯狂的日期格式将会带来麻烦;我建议使用ISO 8601机器可读的YYYY-MM-DD日期格式,除了可能的人工显示(但更好的是,培训您的人类),但我没有更改这一部分。

7gyucuyw

7gyucuyw3#

我不建议这样做,但如果你真的想这样做,你可以做一个

exec >> /filepath/file_date.log 2>&1

作为脚本中的第一个语句。

相关问题