我一直在寻找一种方法将shell脚本的输出路由到syslog,并找到了这篇文章,建议将以下行放在脚本的顶部:
exec 1> >(logger -s -t $(basename $0)) 2>&1
我用以下简单的脚本尝试了这个:
#!/bin/bash
exec 1> >(logger -s -t $(basename $0)) 2>&1
echo "testing"
exit 0
当我从shell运行此脚本时,我确实在syslog中收到了消息,但脚本似乎没有返回 - 为了继续与shell交互,我需要按回车或发送一个SIGINT信号。这里发生了什么? FWIW,我主要使用它来记录cron作业的结果,所以在野外我可能不需要它在交互式shell会话中正常工作,但我很紧张使用我不太了解的东西生产。我主要担心产生一堆不能干净地终止的进程。
我在Ubuntu 15.10,Ubuntu 16.04和OSX上进行了测试,结果相同。
答案 0 :(得分:1)
简而言之:shell脚本确实退出,logger
也是如此 - 实际上没有问题 - 但logger
的输出会导致混乱。
将评论转换为答案。
表面上看,考虑到你描述的症状,发生的事情是Bash在其所有子进程退出之前不会退出。您可以在exec >/dev/null 2>&1
之前尝试exit 0
以查看是否会停止记录器 - 基本上,重定向会关闭其输入,因此它应该终止,允许脚本退出。
但是,当我在macOS Sierra 10.12.2上尝试你的脚本(bash logtest.sh
)时(虽然我不希望它在早期版本中改变),该命令会立即退出并在终端上生成一条日志消息像这样(我使用Osiris JL:
作为我的提示):
Osiris JL: bash logtest.sh
Osiris JL: Dec 26 12:23:50 logtest.sh[6623] <Notice>: testing
Osiris JL: ps
PID TTY TIME CMD
71792 ttys000 0:00.25 -bash
534 ttys002 0:00.57 -bash
543 ttys003 0:01.71 -bash
558 ttys004 0:00.44 -bash
Osiris JL:
我在空白行上点击返回并在ps
命令之前得到提示。
请注意,logger
的消息在提示后到达。
当我运行bash logtest.sh
(其中logtest.sh
包含您的脚本)时,我点击的唯一键是返回输入命令(shell在运行命令之前读取)。然后我得到一个提示,记录器的输出,以及终端等待输入的空白行。这很正常。记录器还没有运行 - 我可以在其他窗口中查看。
尝试输入ls
而不是仅仅点击返回。 shell正在等待输入。它写了它的提示,但记录器输出混淆了屏幕上的布局。对我来说,我得到了:
Osiris JL: bash logtest.sh
Osiris JL: Dec 26 13:28:28 logtest.sh[7133] <Notice>: testing
ls
README.md ix37.sql mq13.c sh11.o
Safe lib mq13.dSYM so-4018-8770
Untracked ll89 oddascevendesc so-4018-8770.c
ci11 ll89.cpp oddascevendesc.c so-4018-8770.dSYM
ci11.c ll89.dSYM oddascevendesc.dSYM sops
ci11.dSYM ll97 rav73 src
data ll97.c rav73.c tf17
doc ll97.dSYM rav73.dSYM tf17.cpp
es.se-36764 logtest.sh rd11 tf17.dSYM
etc mac-clock-get-time rd11.c tf19
fa37.sh mac-clock-get-time.c rd11.dSYM tf19.c
fileswap.sh mac-clock-get-time.dSYM rn53 tf19.dSYM
gm11 makefile rn53.c x-paste.c
gm11.c matrot13 rn53.dSYM xc19
gm11.dSYM matrot13.c sh11 xc19.c
inc matrot13.dSYM sh11.c xc19.dSYM
infile mq13 sh11.dSYM
Osiris JL: