启动服务的脚本:
#!/bin/bash
cd `dirname $0`
source start_base
#make sure classpath .. is ahead of the lib path
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $LIB_JARS:$APP_LIB_JARS:. $CONTAINER_MAIN > $STDOUT_FILE 2>&1 &
echo "Please check the STDOUT file: $STDOUT_FILE"
由于stdout.log文件过大,只有重启服务才会刷新文件,现在试图在服务不重启的情况下,把该文件按照日期或者文件大小来分成不同的文件,最终没有成功
方案1:使用crontab,每天把日志文件复制一份,然后删除日志文件,让程序自动新建一个日志文件往里写日志,或者手工新建一个日志文件让程序往里写。方案失败,因为Linux只认服务一开始创建的那个文件,删除之后程序输出日志不会再新建一个日志文件,手工新建日志文件之后也不再往里面写日志。
方案2:使用crontab,每天把日志文件复制一份,然后把现有日志文件内容清空,让程序继续往文件里写日志。方案失败,因为未停止的服务的日志在清空的时候,文件占用的磁盘空间不会被释放。比如,日志文件有3个G,清空日志文件,文件变为0kb,但新的日志再写入的时候会从3G之后开始写,文件大小立刻会变回3个G,日志文件就会继续增大,不能满足要求。
方案3:修改nohup命令,再命令最后加参数,让程序自动按照时间或者文件大小区分日志文件。方案失败,添加的参数未能达到效果,该日志文件只在程序第一次启动时生效,以后的时间未能按照设置的内容区分开文件,原因未知。
用到的相关命令如下:
清空日志文件的命令:
1.: > filename #其中的 : 是一个占位符, 不产生任何输出.
2.> filename
3.echo “” > filename
4.echo /dev/null > filename
5.echo > filename
nohup按照时间或者文件大小区分日志文件的命令(网上抄的):
每天写一个日志: nohup ./startWebLogic.sh | /apache/bin/rotatelogs ./logs/nohuplog 86400 &
每200M写一个日志: nohup ./startWebLogic.sh | /apache/bin/rotatelogs ./logs/nohuplog 200M &
每200M写一个日志,按时间日期命令名: nohup ./startWebLogic.sh | /apache/bin/rotatelogs ./logs/nohup_%Y%m%d%H%M.log200M &
以上方法我都试过了,没有用
2017年11月30日更新=============================================================
启动后的进程,可以看到该进程的文件描述符,
文件描述符0,1,2分别对应的是标准输入,标准输出,错误输出。
nohup启动脚本最后的 $CONTAINER_MAIN > $STDOUT_FILE 2>&1 & 表示标准输出到某个文件。
文件描述符在Linux系统中以文件的形式存放,位置在/proc/进程pid/fd目录下。
在该目录下2指向的就是输出的文件,看起来是类似一种软链接的形式存放的:
l-wx------ 1 root root 64 Nov 27 17:13 2 -> /data/bootstrap/logs/stdout.log
这个文件描述符就是进程往目标文件输出日志的标识。
关于这个文件描述符:
1,指向的文件位置不能修改,即使root账号也改不了。
2,目标文件只要被删除,文件描述符的指向就会失效(类似没有目标文件的软链接),而且目标文件重建之后,这个链接不会重新生效,除非重启进程。
推测:
Linux有个dup命令和dup2命令,这个命令貌似能改变进程的文件描述符指向的文件位置,从而解决问题。
但是这俩命令我不会用,可能有用。