mac删除目录需要目录的执行权限

最后,遇到一件有意思的事情,在删除一个非空的可读写目录时,发现竟然删除不了:

mkdir tmp
echo "1" > tmp/1
chmod 666 tmp
rm -fr tmp
rm: tmp/1: Permission denied

看了一下错误提示,是在删除tmp/1文件的提示没有权限了,但是这个文件明明是有可读写权限的。

google了一下发现一个解释:

目录其实也是一个文件,这个文件是其他文件的列表,其读、写、执行权限分别控制:

  1. 读:你可以阅读这个文件列表,可以用ls列出所有文件或者可以使用命令补全来补全文件名
  2. 写:可以修改、增加、删除这个列表上的内容
  3. 执行:可以cd进这个目录,可以访问(读、写、执行)这个目录中的子文件

回想了一下刚才删除失败的原因,应该是rm在删除tmp …

more ...

关闭UseDNS来加速ssh登录

最近公司内部几台虚拟器在远程登录的时候特别慢,要等10秒左右才能连接上,开始也没怎么在意,因为公司内部无线网有时候就是很慢。

然后,偶然的机会下,我修改了这几台机器的dns服务器的配置(之前IT调整了dns服务器的ip,这几台远程机器没有我没及时做修改,所以dns服务器配置是错的),发现登录速度又恢复到秒登的级别了。

好奇心使然,我又把dns配置改成之前的,发现登录又要10秒左右了。

我发现这个问题越发有意思了,错误的dns还会影响到ssh的登录过程,之前是万万没想到的。在我的意识里,dns是用来解析域名对应的ip的,我用ssh通过ip来远程登录一台机器,过程中怎么会涉及dns解析呢?

于是做了个实验:先打开一个session,在该session里面一直使用netstat查看网络连接,同时另外一个session发起ssh登录,果然发现在登录过程中有访问dns server的udp连接。

但是为什么ssh登录的过程中为什么会使用到dns呢?google了一圈ssh登录过程,没找到能够解惑的材料。

直接google问题:ssh dns slow

终于找到不少解释,看来这个问题还是蛮普遍的:

http://unix.stackexchange.com/questions/56941/what-is-the-point-of-sshd-usedns-option

http://askubuntu.com/questions/246323/why-does-sshs-password-prompt-take-so-long-to-appear

解决这个问题也很简单 …

more ...

bash while循环读取其他命令的输出

bash while循环读取其他命令的输出有三种方式:pipehere-string以及process substitution

下面通过三段代码来介绍这三种用法以及其中的坑:假设当前目录下有3个.txt文件,通过看看下面三段代码的输出来理解pipe, here-string和process substitution的不同。

pipe


var=0
find . -type f -name "*.txt" | while read i
do 
     ((var++)) 
done
echo $var

输出:0

解释:管道左右的命令会在单独的进程中运行,因此while循环是在一个subshell中执行的,没有改变原shell中的var变量。

here string


var=0
while read i
do 
    ((var++)) 
done <<< "$(find . -type f -name "*.txt …
more ...

cat文件时文件访问时间没有改变

Linux文件系统中,每个文件有三个时间属性:atime(access time)、mtime(modify time)、ctime(change time)

其中atime比较容易理解,即文件的最后访问时间,mtime和ctime有点容易混淆。其中mtime是文件内容的最后修改时间,而ctime是文件inode、属性的最后修改时间。

如果有一个文件123:

  1. echo "test" >> 123会修改文件的mtime和ctime,mtime修改是因为文件内容多了一行"test",ctime修改是因为文件大小(属性)改变了。
  2. chmod +x 123则会修改文件的ctime,因为文件属性改变了,但是内容没有变
  3. 如果cat 123,则会修改文件的atime

操作步骤如下:

image

但是,最近发现一个情况:cat一个文件的时候文件的atime有时改变又是不改变。比如上图中最后一次cat并没有使得文件的atime发生改变。

细细研究了一下,原因如下:

如果每次打开文件的时候,都更新文件的atime,这对系统来说,I/O的负担比较大,影响了系统的性能 …

more ...

使用linux mail发送邮件及一些问题解决

使用方式如下:

echo "test" | env from="fromaddress@yourdomain.com" mail -s "$(echo -e "title\nContent-Type: text/html")" toaddress@dianping.com

or

env from="fromaddress@yourdomain.com" mail -s "$(echo -e "title\nContent-Type: text/html")" toaddress@dianping.com < "context.html"

其中:

  1. 通过设置from变量来修改邮件的发件人
  2. 通过-s指定邮件标题,Content-type指定文件内容格式,chareset指定编码
  3. 通过管道echo "test" |或者<写入邮件内容,可以是文本也可以是html格式

不过在使用过程中遇到两个问题导致邮件发送失败 …

more ...

crontab使用

crontab格式:

minute hour day-of-month month-of-year day-of-week [username] command

如果某用户使用crontab -e增加了定时任务,那么系统会使用该用户身份执行该任务。所以username不需要填,填了会被认为是command。

附几个常用用法,有助于理解定时任务的配置:

01 * * * * run_hourly
*/5 * * * * run_every_5mins
02 4 * * * run_daily
22 4 * * 0 run_weekly
42 4 1 * * run_monthly

另外:

/etc/crontab中是全局的定时任务配置

/var/log/cron可以查看定时任务的执行记录

/var/spool/cron/work中记录了work用户设置的定时任务

还有一点要注意:crontab是以non-login方式启动任务的,这时环境中会加载~/.bashrc的内容,不会加载~/.bash\_profile的内容。如果crontab运行的脚本中依赖 …

more ...

linux cp过程中ignore部分文件

遇到一个需求,在cp的过程中需要ignore掉部分文件,发现cp没有自带ignore之类的选项。

比较容易的方式是使用rsync,但是折腾的过程中发现,使用find+cp也是可以达到ignore的目的的:

cd src && find ./ -type f -not -name '12' -not -name '13' -exec cp --parents '{}' './dst/' \;

记录一下,免得需要时又到处找。

more ...

linux会话中将前台任务转入后台

有时会遇到这样一种情况:在没有使用screen之类的管理会话的软件的时候,需要退出当前运行会话,但会话中有个任务运行了很久了,退出的话这个任务会被kill掉(收到SIGHUP的信号)。

下面的方法可以将这个前台进程转入后台,并指定这个任务不被发送SIGHUP信号:

  1. ctrl+z将任务暂停,这时屏幕会打印这样一句[1]+  Stopped  ./myserver
  2. 使用bg 1将这个任务转入后台运行(1是刚才暂停任务的job号,步骤1中屏幕提示方括号里面的内容,如果忘了也可以用jobs命令查看)
  3. 使用disown –h %1指定shell退出时不要发送SIGHUP给任务1(注意任务号前面有个%)

关于disown的详细说明,可以查看man bash或man disown搜索disown

当然,如果在启动任务之前意识到这个问题,可以用nohup ./myserver &的方式将会话放到后台运行,并通过nohup指定进程不处理SIGHUP信号。

more ...

linux获取当前执行脚本

今天遇到一个需求,获取当前执行脚本: - 如果是sh test.sh或者./test.sh的运行方式,那么很简单,直接使用$0就可以了。
- 如果是source test.sh或者. ./test.sh的方式运行,$0就变成了-bash了。
google了一下,这个时候就需要使用$BASH_SOURCE了。(bash版本>=3.0)

[u1@localhost test]$ cat test.sh
echo $0
echo $BASH_SOURCE
[u1@localhost test]$ sh test.sh
test …
more ...

Linux常用命令

系统软硬件、配置查看:

操作系统版本:uname, lsb_release

CPU信息查看:cat /proc/cpuinfo

core相关配置:/proc/sys/kernel/core_pattern,/proc/sys/kernel/core_uses_pid

系统core/栈大小/进程句柄数等等配置:ulimit

查看内存页大小:/usr/bin/getconf PAGE_SIZE/PAGESIZE

查看系统加载的动态库:/sbin/ldconfig

系统实时信息查看:

ps:查看系统当前进程相关信息

netstat:查看系统tcp连接、端口占用等信息

top:查看系统CPU、进程使用内存、CPU等等信息

sar:查看机器CPU、网络等等信息

free:查看机器内存相关信息

vmstat:查看机器内存、swap相关信息

dmesg …

more ...