如果输出重定向到记录器,则Shell脚本不会退出

时间:2016-12-26 20:14:31

标签: linux bash shell ubuntu

我一直在寻找一种方法将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上进行了测试,结果相同。

1 个答案:

答案 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: