linux 之环境变量

测试

a.sh

 

b.sh

结果: 没有A=A ,也没有 a=a

 

结果: 有A=A, 没有 a=a

结论

  1. 环境变量和变量是不同的, /proc/pid/environ 中只是“环境”变量,不同变量是不会体现在该文件中的
  2. export导出的变量,在后续执行的shell进程中可以看到,不导出则看不到
  3. 尽管b.sh中export了b变量,a.sh中也是看不到的,因为b.sh是一个新的进程

脚本中执行其它脚本的几种方法:

  1. 如上面a.sh中执行b.sh ,可以理解是a.sh调起了一个新的进程来执行b.sh的
  2. 在a.sh中如果用source(或 . )来执行 b.sh ,则b.sh中将可以看到A,也可以看到a,因为这样的话b.sh并不是一个新的进程,而是在当前进程中执行的
  3. 在a.sh 中如果用exec来执行b.sh,则b.sh经在当前进程中执行,但是不同于source的是,b.sh下面的命令将不会被执行,进程将随着b.sh执行的结束而结束

 

 

自动代理设置

自动代理可以通过dhcp、dns两种方式实现,参考资料: https://www.ibm.com/developerworks/cn/linux/1309_quwei_wpad/

 

基本原理:

  1. 通过DHCP的实现方式:
    1. DHCP时,可以下发自动代理配置的url,如: http://172.16.1.1/wpad.dat
  2. 通过DNS的实现方式:
    1. 浏览器会自动查找 wpad的A记录,如果能查到,则通过 http://wpad/wpad.dat 来下载自动代理脚本 (当然,你也可以设置 wpad的hosts)

更多参考: http://findproxyforurl.com/deploying-wpad/

关于设置代理、设置pac文件、设置wpad的一些比较: http://findproxyforurl.com/why-pacwpad/

pac脚本(或wpad)文件可以对相同的资源设置多个代理,方便failover

pac脚本支持的函数: http://findproxyforurl.com/pac-functions/

关于dhcp方式、dns方式的比较: 浏览器普遍支持dns实现方式,部分浏览器(Firefox)不支持dhcp实现方式: http://findproxyforurl.com/browser-support/

PHP 软连接的缓存问题

测试脚本test.php:

在另外一个terminal中修改link.txt 链接到 b.txt

发现输出的依然是a.txt 的内容(至少一段时间内是的)

strace 分析一下,发现在cache期间,根本不会去访问 link.txt 的

原因:

realpath_cache 缓存了软连接 默认时间 120s

解决办法:

修改php.ini 中 realpath_cache 的配置

参考资料:http://zhengdl126.iteye.com/blog/1575233

memcache 实现高可用锁

我们知道,通过Memcache的add操作可以实现远程锁的功能,但是,如果Memcache意外down机怎么办?

一半来讲,多机部署是解决思路;那么,锁本来是要集中控制的,分布式如何实现呢?

这里只讨论两台机器部署的情况,不讨论N(N > 2) 的情况;我们认为两台机器同时故障的可能性很小,是可以接受的。

现在有m1和m2两台Memcache的机器,首先去m1申请锁,如果失败(可能是m1宕机了),则再去m2申请锁,似乎是可以的了。

思考:如果有人从m1抢到了锁,然后m1宕机了,后面的人zi自然会去m2抢锁,必然会有一个人能抢到,这时候,一个锁就会被两个人持有了;或许这比两台机器同时宕机的可能性都小,但是,这种情况是可以有解决办法的。

改进:

  1. 首先去m1申请锁
    1. 如果申请到了,则马上去m2上也申请一把锁(如果m2宕机了,就无所谓了)
    2. 如果被别人抢走了,则,啥也不做
    3. 如果m1宕机了,则,可能是在有人抢走锁之后宕机的,也可能是早就宕机了,那么,过20s再去m2上申请锁;
      1. 过 20s的原因:避免A在m1上抢到锁之后m1立即宕机,而B发现m1宕机,却抢在A之前在m2上抢到了锁

虽然逻辑复杂了一些,但是比使用zookeeper是要方便多了

sudo without a tty

缘起

当通过ssh远程执行一条命令时,如果命令脚本中使用了sudo,则有可能会提示:

解决办法:

方案1. ssh 添加 -t 选项

方案2. 执行sudo的机器上,编辑 /etc/sudoer ,注释掉:

 

参考资料:

http://www.tuicool.com/articles/2iUVry

关于log4j的一些辛酸

虽然没写过java,但是log4j却如雷贯耳。

现在想学习一下log4j,但是没有太多时间去看文档,java的东西都是经过了非常精心的设计的,应该比较好用,先写个例子吧,一边google、百度,一边调试,于是辛酸就开始了,万万没想到会遇到这么多的问题。

既然有log4j2,我自然不会去选择使用log4j,当然,我入门时是不会太过于关于二者的差别的,但是,不管我是否关心,差别都那么明显地存在着呢。

有文章(http://blog.csdn.net/anlina_1984/article/details/5313023)说,log4j支持两种配置文件格式:

其实,这log4j2已经不是这样了,有文章(http://www.csdn123.com/html/topnews201408/96/1896.htm)说:

加载配置文件的方式也不一样了,log4j:

log4j2:

 

更加郁闷的是:

从http://logging.apache.org/log4j/2.x/download.html 下载下来的apache-log4j-2.3-bin.zip 里面包含了log2j-1.2 的相关jar包

 

log4j2 默认支持 yaml、xml、json格式的配置文件,添加插件可以支持更多