分类 Shell/Script 下的文章

RPM中的%config和%config(noreplace)

打开一个rpm spec文件,在 %files段有一个指令很常见:%config(noreplace),这个指定到底是干什么用的呢?

答案是,该指令决定如果一个文件被管理员修改过后,下次更新该文件所在的rpm包时,该文件的存在状态。例如,一般升级软件时,配置文件是不会变化的,而主程序则一般需要被升级(替换)。

对于spec文件中在%files段的某一个文件,我们要讨论三种情况:

  1. 没有带%config指令。例如:%{_sbindir}/redis-server
  2. 带了%congfig指令。例如:%config %{_sysconfdir}/redis/redis.conf
  3. 带了%config(noreplace)指令。例如:%config(noreplace) %{_sysconfdir}/redis/redis.conf

- 阅读剩余部分 -

依赖一个RPM来制作新的RPM

项目中有这样一个场景:A软件通过RPM包发布,B软件严重依赖A软件,但在它的基础上有一些业务逻辑的添加和修改。A软件是公司一个历史悠久的产品,且保持频繁的更新,B软件是我在维护。

在开发的时候,很简单,先把某一个稳定版本的A软件安装到开发机上,然后直接进行业务逻辑的开发就可以了。但在发布的时候肯定就不能这么做了,你很难要求运维先去发布服务器上下载一个A软件的rpm包,安装或更新完后,再去发布服务器上下载一个B软件的业务逻辑包,再进行相关的配置。如果是一台机器就罢了,几十上百台服务器这样玩就是作死。所以,我需要做出一个B软件的独立的rpm包,用这个rpm包安装或更新后,直接能进行相关的配置。

再来澄清一下需求:B软件既要严重依赖A软件,但要在A软件上添加很多业务逻辑。但要求在发布的时候脱离对A软件rpm包的依赖。

最简单的方法,当然是先把A软件的代码库做一个分支,或者拷贝出一个新的代码库,在上面进行开发,将B软件与A软件独立开来。这样发布的时候当然就是一个独立的包了。但如前所属,A软件更新频繁,生命力旺盛,我可不想时时来在同步上花时间。

- 阅读剩余部分 -

利用here document携带c代码

假设你想通过一段脚本调用make来编译代码,并且在脚本中将一些编译需要的系统信息传递给makefile,可以通过bash的here document来实现。例如:

tmp_src_filename=fdfs_check_bits.c
cat <<EOF > $tmp_src_filename
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
        printf("%d\n", (int)sizeof(long));
        printf("%d\n", (int)sizeof(off_t));
        return 0;
}
EOF

gcc -D_FILE_OFFSET_BITS=64 -o a.out $tmp_src_filename
output=$(./a.out)

上面的代码摘自FastDFS的make.sh。

emlog的一键备份

不知道大家平时备份是不是和我一样这么操作的:

  1. 登陆到后台,备份sql(当然,或者是用插件定期备份发送到邮箱)
  2. 用ftp备份content目录

如果你想简化操作,并且和我一样苦逼的用着虚拟主机,下面的脚本也许可以帮到你。脚本很丑陋,能完成功能即可。

- 阅读剩余部分 -

漫谈logrotate与crond

什么是logrotate

logrotate是一款用来切割日志的工具,更确切的说,是切割文本的工具,但通常用在软件日志切割上。为什么要进行日志切割呢?原因可以有很多,最明显的一个就是防止日志文件变得太大。

lorotate的切割方式

以nginx为例,假设其错误日志放在/data/proclog/log/nginx/下,名为nginx_error.log,当logrotate运行时,如果满足切割要求了,则会将nginx_error.log改名为nginx_error.log.1,并重新创建一个新的空文件nginx_error.log作为新的错误日志。

当进行其二次切割时,nginx_error.log.1被改名为nginx_error.log.2,刚才创建的nginx_error.log被改名为新的nginx_error.log.1,然后再次重新创建一个新的空文件nginx_error.log作为新的错误日志投入使用。

当进行第三次切割时,nginx_error.log.2变为nginx_error.log.3,nginx_error.log.1变为nginx_error.log.2,nginx_error.log变为nginx_error.log.1,一个新的nginx_error.log被再次创建。

- 阅读剩余部分 -