现象,我在windows环境下写了一个sh脚本,然后ftp到liunx服务器,代码看起来非常正确,就是执行不了.报错如下:
cannot stat '/alidata/server/nginx/logs/\r/access.log'
问题:脚本编码问题
解决:
vim 下命令
普通模式 :set ff //查看编码 doc 或者unix
:set fileformat=unix //设置编码
脚本代码:
#!/bin/bash
savepath_log='/opt/nginx/logs'
nglogs='/alidata/server/nginx/logs'
mkdir -p $savepath_log/$(date +%Y)/$(date +%m)
mv ${nglogs}/access.log ${savepath_log}/$(date +%Y)/$(date +%m)/access.$(date +%Y%m%d).log
mv ${nglogs}/error.log ${savepath_log}/$(date +%Y)/$(date +%m)/error.$(date +%Y%m%d).log
kill -USR1 `cat /alidata/server/nginx/logs/nginx.pid`
#USR1 重新打开一个日志文件
分析:
1. nginx 的主进程收到USR1信号,会重新打开日志文件(配置文件中设置的日志,如果不存在,会自动创建一个新的xxx.log)
2. 在没有执行kill -USR1 `cat ${pid_path}` 之前,即便已经对文件执行了mv命令改变文件名称,nginx还是会向新命名的文件access_20160801.log 照常写入日志数据的。原因是linux系统中内核是根据文件描述符来找文件的。