将所有命令stdout / stderr从脚本中redirect到日志文件

我已经阅读了如何单独logging某些脚本或命令,但没有logging如何loggingBASH shell中的所有命令。 我想要做的是:

  • 用户运行脚本。 (脚本从现在开始loggingstdout / stderr到日志文件)
  • 用户做其他的东西/运行其他命令/回声/等,所有这些都logging在日志文件。

less罗嗦/更有代表性的例子:

当用户input时, exec(> tee logfile.log)正是我想要做的。 它将stdoutlogging到logfile.log,并将继续这样做直到bash shell被closures。 但是,将这个命令作为脚本运行并不是这样做的。 我想要它。

你不能在自己的shell下运行脚本(即以#!/bin/bash开头,你使用chmod +x并像可执行文件一样调用它)来执行此操作。 重定向会影响子shell,但无法到达父级来执行所需操作。 你可以. 该文件(如. ./myscript.sh )将执行你的shell中的命令,然后你可以重定向的东西,你想要的。

另一种方法是让你的脚本自己启动一个子shell(它会继承stdin,stdout,stderr)。 这是script命令的作用。 它将所有内容都记录到一个名为(缺省) typescript的文件中,直到用户退出子shell。

$ bash | tee /tmp/logs/logfile.txt

$ ls / tmp / logs

LOGFILE.TXT

$ <CTRL-D>

出口

$ cat /tmp/logs/logfile.txt

LOGFILE.TXT


如果你正在寻找标准输出,那么这似乎工作。 如果你想要标准输入/标准输出,那么脚本是前面提到的方式。

别名怎么样?

 alias Start-Script='script logfile.txt' 

仅供参考,如果有人想这样做启动一个守护进程(后台进程),我建议看看优秀的守护进程 。

daemonize允许你从一个特定的目录(不用cd)启动一个进程,重定向stdout,重定向stderr,写一个pidfile或者lockfile,然后以某个用户的身份运行。 这是非常有用的,例如。 当你写自己的小init脚本。

从手册页摘要告诉你最相当简单的用法:

 daemonize [-a] [-c directory] [-e stderr] [-o stdout] [-p pidfile] [-l lockfile] [-u user] [-v] path [arg] ...