Rootop 服务器运维与web架构

2015-10-20
发表者 Venus
linux下cat一个文件并重定向到此文件为什么会为空已关闭评论

linux下cat一个文件并重定向到此文件为什么会为空

现在有一个txt文件,内容如下:
[root@www ~]# cat 1.txt
a
b
c
现在通过cat查看此文件,并将内容重定向到这个文件。
[root@www ~]# cat 1.txt > 1.txt
cat: 1.txt: input file is output file
[root@www ~]# cat 1.txt
[root@www ~]#
得到一个错误提示,并且1.txt内容为空。

重新添加3条数据
[root@www ~]# cat 1.txt
a
b
c

通过tail来测试
[root@www ~]# tail -1 1.txt > 1.txt
[root@www ~]# cat 1.txt
[root@www ~]#
没有错误,并且文件内容也是为空。

我们知道 > 重定向会把前面的数据输出到后面指定的文件中,如果文件不存在会自动创建,如果存在会清空。

那么到底是先执行cat 1.txt再输出到文件,还是先创建(清空)文件?

看看老外怎么说: http://www.unix.com/unix-for-dummies-questions-and-answers/108127-output-file-redirection.html

百度知道网友给出的解答:
重定向的原理;
在unix下,输出到终端与输出到文件本质是一样的;三个标准数据流,stdin,stdout,stderr只是三个特殊的文件而已(而且大部分时候它们是一样的)

每个程序都有一张文件表,该表记录了该程序打开的文件。默认情况下就打开了stdin,stdout,stderr。当执行ls的时候,程序输出到stdout,指向终端显示。
当执行ls > 123的时候,bash首先以写的方式打开(如果没有则创建)123。得到一个文件描述符fd;文件描述符可以简单理解为指向文件的指针。stdin,stdou,stderr都有一个对应的文件描述符,只是比较特殊,它们指向终端。
然后bash下面的动作,简单的理解就是把ls的stdout赋值为新打开的文件描述符fd;这样当ls向标准输出stdout写数据的时候其实就写入了文件123当中,而ls对此毫不知情。

所以是先创建了123,然后再执行;但是数据不经过bash,而是直接从ls输出到了123当中,就好像ls本来就要把数据输出到123。

如果你想明白bash是如何改变ls的stdout值的,那么你还需要理解fork系统调用;

那么这样一来就明白了,重定向是先创建或者清空文件,再执行前面的命令,所以导致文件内容为空。

2015-10-10
发表者 Venus
php删除数组中的某个key元素已关闭评论

php删除数组中的某个key元素

数组:

$arr = array(".", ".", "0001", "0002");
var_dump($arr);

结果:

array(4) {
 [0] =>
 string(1) "."
 [1] =>
 string(2) ".."
 [2] =>
 string(4) "0001"
 [3] =>
 string(4) "0002"
}

需要把值为”.”和”..”的删掉

方法一:

unset($arr[0]);
unset($arr[1]);

var_dump($arr);

结果:

array(2) {
 [2] =>
 string(4) "0001"
 [3] =>
 string(4) "0002"
}

重新排序:

$list = array_merge($arr);
var_dump($list);

结果:

array(2) {
 [0] =>
 string(4) "0001"
 [1] =>
 string(4) "0002"
}

方法二直接删除并排序:

array_splice($arr, 0, 2);
var_dump($arr);

结果:

array(2) {
 [0] =>
 string(4) "0001"
 [1] =>
 string(4) "0002"
}

2015-09-23
发表者 Venus
php获取客户端ip及获取ip所在地址已关闭评论

php获取客户端ip及获取ip所在地址

<?php
// 获取ip

function ip()
{
 if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
 $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
 else if (isset($_SERVER["HTTP_CLIENT_IP"]))
 $ip = $_SERVER["HTTP_CLIENT_IP"];
 else
 $ip = $_SERVER["REMOTE_ADDR"];

 return $ip;
}

$ip = ip();

// 通过百度apistore中api获取
// http://apistore.baidu.com/apiworks/servicedetail/114.html

 $ch = curl_init();
 $url = "http://apis.baidu.com/apistore/iplookupservice/iplookup?ip=$ip";
 $header = array(
 'apikey: 你的apikey',
 );
 // 添加apikey到header
 curl_setopt($ch, CURLOPT_HTTPHEADER , $header);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 // 执行HTTP请求
 curl_setopt($ch , CURLOPT_URL , $url);
 $res = curl_exec($ch);

 $arr = json_decode($res, true);

 echo "ip: " . $arr['retData']['ip'] . "<br/>";
 echo "address: " . $arr['retData']['country'] . "-" . $arr['retData']['province'] . "-" . $arr['retData']['city'] . "-" . $arr['retData']['district'] . "-" . $arr['retData']['carrier'];

2015-09-16
发表者 Venus
linux让history显示出历史命令执行时间已关闭评论

linux让history显示出历史命令执行时间

默认history不会显示命令的执行时间,这里加3行代码到当前用户的 .bashrc 配置文件下:

[root@localhost ~]# vi .bashrc
#设置时间格式
export HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S "
#设置记录历史命令文件的大小
export HISTFILESIZE=1000000
#设置历史命令条数
export HISTSIZE=2000

这样用户下次登录会自动执行3条export,或者通过下面命令立即生效。

[root@localhost ~]# source .bashrc

如果针对系统中所有的账户,可以直接编辑 /etc/profile 这个文件添加上面3行,实现全局用户都统计。

另外补充:

只有在用户登出系统时,这次所执行的命令都会写到 .bash_history 中记录。
通过history -c 可以清除当前连接终端的历史命令记录,登出时不会有这次历史命令写入到 .bash_history 。
但是之前的记录还是存在的。
最根本的解决方法是:

[root@localhost ~]# cat /dev/null > .bash_history
[root@localhost ~]# history -c

2015-09-08
发表者 Venus
php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法已关闭评论

php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法

1.获取上个月第一天及最后一天.

 echo date('Y-m-01', strtotime('-1 month'));
 echo "<br/>";
 echo date('Y-m-t', strtotime('-1 month'));
 echo "<br/>";

2.获取当月第一天及最后一天.

 $BeginDate=date('Y-m-01', strtotime(date("Y-m-d")));
 echo $BeginDate;
 echo "<br/>";
 echo date('Y-m-d', strtotime("$BeginDate +1 month -1 day"));
 echo "<br/>";

3.获取当天年份、月份、日及天数.

 echo " 本月共有:".date("t")."天";
 echo " 当前年份".date('Y');
 echo " 当前月份".date('m');
 echo " 当前几号".date('d');
 echo "<br/>";

4.使用函数及数组来获取当月第一天及最后一天,比较实用,出自网友.

 function getthemonth($date)
 {
 $firstday = date('Y-m-01', strtotime($date));
 $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));
 return array($firstday,$lastday);
 }
 $today = date("Y-m-d");
 $day=getthemonth($today);
 echo "当月的第一天: ".$day[0]." 当月的最后一天: ".$day[1];
 echo "<br/>";