su: warning: cannot change directory to /home/XXXX: Permission denied
Unix/LinuxC技术 jackxiang 2015-9-6 09:27
背景:我是一个同事,操作一些命令后出现这个问题,经过chmod 755 / 问题得到解决。
客户一个oracle突然当机了,由于业务启动,客户下意识的重启了服务器,系统是起来了,准备切换到oracle用户下启动数据库,可以怎么都无法su切换,真是火上浇油呀,描述如下:
在root用户下,su到一个普通用户oracle,得到如下错误:
[root@localhost ~]# su - oracle
su: warning: cannot change directory to /home/oracle: Permission denied
su: /bin/bash: Permission denied
而oracle用户也无法通过直接登录,出现同样错误。
这是一个非常奇怪的问题,到底是什么导致的呢?思路如下:
1,程序执行权限问题
2,程序依赖的共享库权限问题
3,目录权限问题
4,根空间问题。
检查/bin/bash,权限正确,检查/home/oracle权限正确,检查/lib/ld-***.so,权限也正确。
继续调试,检查/etc/passwd,将oracle的home设置为/tmp,把/tmp设置为777,这个权限应该是最宽松的。
而su出现同样的错误。
也就是oracle用户无法访问777权限的/tmp。
问题到底出现在哪里呢?
最后
通过star命令,看到了问题根本,
[root@localhost ~]#stat /
输出如下:因为你ls是看不到的。
File: “/”
Size: 1024 Blocks: 2 IO Block: 1024 目录
Device: 803h/2051d Inode: 2 Links: 22
Access: (0666/drw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-12-01 22:28:48.000000000 +0800
Modify: 2007-12-01 22:28:34.000000000 +0800
Change: 2007-12-01 23:17:35.000000000 +0800
问题出来了,这里的权限是错误的,X权限的丢失造成的。
[root@localhost ~]#chmod 755 /
修改后,问题消失。
产生上述问题的方法:
第一种,chmod 666 /,可以导致。
或者,
第二种,chmod 700 /lib/ld-xxxx.so,也可以导致su失败。
有兴趣可以自己试一下。
/ 权限的丢失对于各种运行在自己用户身份上的daemon也存在同样的影响。
原文链接: http://www.ixdba.net/a/mz/2010/0421/14.html
客户一个oracle突然当机了,由于业务启动,客户下意识的重启了服务器,系统是起来了,准备切换到oracle用户下启动数据库,可以怎么都无法su切换,真是火上浇油呀,描述如下:
在root用户下,su到一个普通用户oracle,得到如下错误:
[root@localhost ~]# su - oracle
su: warning: cannot change directory to /home/oracle: Permission denied
su: /bin/bash: Permission denied
而oracle用户也无法通过直接登录,出现同样错误。
这是一个非常奇怪的问题,到底是什么导致的呢?思路如下:
1,程序执行权限问题
2,程序依赖的共享库权限问题
3,目录权限问题
4,根空间问题。
检查/bin/bash,权限正确,检查/home/oracle权限正确,检查/lib/ld-***.so,权限也正确。
继续调试,检查/etc/passwd,将oracle的home设置为/tmp,把/tmp设置为777,这个权限应该是最宽松的。
而su出现同样的错误。
也就是oracle用户无法访问777权限的/tmp。
问题到底出现在哪里呢?
最后
通过star命令,看到了问题根本,
[root@localhost ~]#stat /
输出如下:因为你ls是看不到的。
File: “/”
Size: 1024 Blocks: 2 IO Block: 1024 目录
Device: 803h/2051d Inode: 2 Links: 22
Access: (0666/drw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-12-01 22:28:48.000000000 +0800
Modify: 2007-12-01 22:28:34.000000000 +0800
Change: 2007-12-01 23:17:35.000000000 +0800
问题出来了,这里的权限是错误的,X权限的丢失造成的。
[root@localhost ~]#chmod 755 /
修改后,问题消失。
产生上述问题的方法:
第一种,chmod 666 /,可以导致。
或者,
第二种,chmod 700 /lib/ld-xxxx.so,也可以导致su失败。
有兴趣可以自己试一下。
/ 权限的丢失对于各种运行在自己用户身份上的daemon也存在同样的影响。
原文链接: http://www.ixdba.net/a/mz/2010/0421/14.html
背景:c语言把整数写入文件,并读出,C语言写整数到文件用啥函数? 我看 fwrite 是写char*的。这个在调试队列时可以用上,有时入队出队不一致时,通过入队写了多少行出队写了多少行就知道到底队列程序在数据量大时有没有问题。
摘自:http://blog.163.com/song_0803/blog/static/4609759720112231158527/
入队写文件:
出队写文件:
整个换行到里面去,否则全是888不太好用vim 打开直接set nu看多少行:
w+以纯文本方式读写,而wb+是以二进制方式进行读写。
mode说明:
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
wb 只写方式打开或新建一个二进制文件,只允许写数据。
wb+ 读写方式打开或建立一个二进制文件,允许读和写。
r 打开只读文件,该文件必须存在,否则报错。
r+ 打开可读写的文件,该文件必须存在,否则报错。
rb+ 读写方式打开一个二进制文件,只允许读写数据。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
摘自:http://blog.163.com/song_0803/blog/static/4609759720112231158527/
入队写文件:
出队写文件:
整个换行到里面去,否则全是888不太好用vim 打开直接set nu看多少行:
w+以纯文本方式读写,而wb+是以二进制方式进行读写。
mode说明:
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
wb 只写方式打开或新建一个二进制文件,只允许写数据。
wb+ 读写方式打开或建立一个二进制文件,允许读和写。
r 打开只读文件,该文件必须存在,否则报错。
r+ 打开可读写的文件,该文件必须存在,否则报错。
rb+ 读写方式打开一个二进制文件,只允许读写数据。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
php -a 交互式 0 === false???,PHP 的 Interactive shell 模式,Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。
Php/Js/Shell/Go jackxiang 2015-8-26 11:38
背景:有时PHP像python那样可交互能对小代码片段的验证提高效果,但默认编译好像是不行的。
[root@localhost htdocs]# php -i | grep readline
[root@localhost htdocs]# 主要的差異在於 Compile 時, 有沒有加入 "--with-readline",
试着安一个扩展:
readline 相关错误
现象:configure: error: Please reinstall libedit – I cannot find readline.h
解决办法:安装 Editline Library (libedit),官网:http://thrysoee.dk/editline/
下载最新版 libedit 编译安装即可。
直载后,直接:configure && make && make install
正确安装如下:
#php -a
Interactive shell
php > echo "hello" ;
hello
不对的输出如下,输入 php -a 之后,基本就没有反应了。:
#php -a
Interactive mode enabled
解决方法:
重新编译安装php,加入--with-readline选项。
php -i | grep "\-\-with\-readline" --color
不正确的输出是空,正确的输出编译项里有。
_____________________________________________________________________________
./configure --with-readline
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
./configure
make && make install
[root@iZ25dcp92ckZ readline]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
安上了,但还是失败了:
[root@iZ25dcp92ckZ readline]# php -a
php > echo "helo";
php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/readline.so: undefined symbol: append_history
这儿有一个兄弟也在问一样的问题,说是:php 的 readline 模块和所使用的 readline 库的版本差异太大了。
摘自:http://segmentfault.com/q/1010000002455369
——————————————————————————————————————————————————————
0 === false???
php > var_dump( 0 === false);
bool(false)
php > $res =0;
php > var_dump( $res === false);
bool(false)
php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1440560402
1
————————————————————————————————————————————————————
臨時要測個簡單的程式片段 或 Function, 一般都會於 CLI 寫來跑一跑, Interactive 模式 可以邊寫邊測試~ (互動模式, 寫完一行就 Compile 一行)
而 PHP CLI 的模式有兩種差異: (執行方法: $ php -a, 說明可見: PHP: Interactive shell)
Interactive shell 比較像是 互動式, 有問有答的執行程式.
Interactive mode enabled 則是輸入一整個區塊的程式碼, Ctrl-D 執行.
目前 (2012年) Ubuntu Linux 內建預設的是 Interactive shell, 而 Debian 是 Interactive mode enabled.
主要的差異在於 Compile 時, 有沒有加入 "--with-readline", 可使用 "php -i | grep readline" 查看.
Interactive mode enabled
$ php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1330954647
1
Interactive shell
$ php -a
Interactive shell
php > echo time();
1330954675
php > $a = 1;
php > echo $a;
1
来自:http://blog.longwin.com.tw/2012/03/php-interactive-shell-2012/
解决办法就是重新编译并安装一次加上参数:
http://blog.csdn.net/pqhdp/article/details/9386185
在php Interactive mode里敲代码不需要<?php ?>的啊,直接输入echo "hello"; 回车就可以了。
还有php现在有一个还不错的repl实现
https://github.com/borisrepl/boris
比 php -a 要更舒服一些。
演示:http://segmentfault.com/a/1190000000353069
需要git。
—————————Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。—————————
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: 10.64.5.100
* updates: 10.64.5.100
* addons: 10.64.5.100
* extras: 10.64.5.100
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 1.9 kB 00:00
primary.sqlite.bz2 100% |=========================| 504 kB 00:00
addons 100% |=========================| 1.9 kB 00:00
extras 100% |=========================| 2.1 kB 00:00
Setting up Install Process
Parsing package install arguments
No package git available.
Nothing to do
[root@localhost boris-1.0.10]# cat /etc/redhat-release
CentOS release 5.2 (Final)
[root@localhost boris-1.0.10]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
warning: /var/tmp/rpm-xfer.Q9d5Ba: Header V3 DSA signature: NOKEY, key ID 217521f6
Preparing... ########################################### [100%]
1:epel-release ########################################### [100%]
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
yum install git
Total download size: 7.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): git-1.8.2.1-1.el5. 20% |===== | 1.5 MB 00:12 ETA
安git参看:http://www.letuknowit.com/post/19.html,为何要安?是因为想用它安装PHP的Boris——PHP也有REPL。
演示:http://segmentfault.com/a/1190000000353069
你可以通过 Packagist 来安装 Boris。当然你也可以直接克隆它的 git 仓库:
git clone git://github.com/d11wtq/boris.git
cd boris
./bin/boris
Boris以MIT许可证发布。更多信息请访问Boris在GitHub上的项目主页。
[root@localhost local]# git clone git://github.com/d11wtq/boris.git
Cloning into 'boris'...
remote: Counting objects: 1061, done.
remote: Total 1061 (delta 0), reused 0 (delta 0), pack-reused 1061
Receiving objects: 100% (1061/1061), 204.32 KiB | 62 KiB/s, done.
Resolving deltas: 100% (506/506), done.
[root@localhost local]# cd boris
[root@localhost boris]# ./bin/boris
[root@localhost htdocs]# php -i | grep readline
[root@localhost htdocs]# 主要的差異在於 Compile 時, 有沒有加入 "--with-readline",
试着安一个扩展:
readline 相关错误
现象:configure: error: Please reinstall libedit – I cannot find readline.h
解决办法:安装 Editline Library (libedit),官网:http://thrysoee.dk/editline/
下载最新版 libedit 编译安装即可。
直载后,直接:configure && make && make install
正确安装如下:
#php -a
Interactive shell
php > echo "hello" ;
hello
不对的输出如下,输入 php -a 之后,基本就没有反应了。:
#php -a
Interactive mode enabled
解决方法:
重新编译安装php,加入--with-readline选项。
php -i | grep "\-\-with\-readline" --color
不正确的输出是空,正确的输出编译项里有。
_____________________________________________________________________________
./configure --with-readline
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
./configure
make && make install
[root@iZ25dcp92ckZ readline]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
安上了,但还是失败了:
[root@iZ25dcp92ckZ readline]# php -a
php > echo "helo";
php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/readline.so: undefined symbol: append_history
这儿有一个兄弟也在问一样的问题,说是:php 的 readline 模块和所使用的 readline 库的版本差异太大了。
摘自:http://segmentfault.com/q/1010000002455369
——————————————————————————————————————————————————————
0 === false???
php > var_dump( 0 === false);
bool(false)
php > $res =0;
php > var_dump( $res === false);
bool(false)
php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1440560402
1
————————————————————————————————————————————————————
臨時要測個簡單的程式片段 或 Function, 一般都會於 CLI 寫來跑一跑, Interactive 模式 可以邊寫邊測試~ (互動模式, 寫完一行就 Compile 一行)
而 PHP CLI 的模式有兩種差異: (執行方法: $ php -a, 說明可見: PHP: Interactive shell)
Interactive shell 比較像是 互動式, 有問有答的執行程式.
Interactive mode enabled 則是輸入一整個區塊的程式碼, Ctrl-D 執行.
目前 (2012年) Ubuntu Linux 內建預設的是 Interactive shell, 而 Debian 是 Interactive mode enabled.
主要的差異在於 Compile 時, 有沒有加入 "--with-readline", 可使用 "php -i | grep readline" 查看.
Interactive mode enabled
$ php -a
Interactive mode enabled
<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1330954647
1
Interactive shell
$ php -a
Interactive shell
php > echo time();
1330954675
php > $a = 1;
php > echo $a;
1
来自:http://blog.longwin.com.tw/2012/03/php-interactive-shell-2012/
解决办法就是重新编译并安装一次加上参数:
http://blog.csdn.net/pqhdp/article/details/9386185
在php Interactive mode里敲代码不需要<?php ?>的啊,直接输入echo "hello"; 回车就可以了。
还有php现在有一个还不错的repl实现
https://github.com/borisrepl/boris
比 php -a 要更舒服一些。
演示:http://segmentfault.com/a/1190000000353069
需要git。
—————————Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。—————————
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: 10.64.5.100
* updates: 10.64.5.100
* addons: 10.64.5.100
* extras: 10.64.5.100
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 1.9 kB 00:00
primary.sqlite.bz2 100% |=========================| 504 kB 00:00
addons 100% |=========================| 1.9 kB 00:00
extras 100% |=========================| 2.1 kB 00:00
Setting up Install Process
Parsing package install arguments
No package git available.
Nothing to do
[root@localhost boris-1.0.10]# cat /etc/redhat-release
CentOS release 5.2 (Final)
[root@localhost boris-1.0.10]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
warning: /var/tmp/rpm-xfer.Q9d5Ba: Header V3 DSA signature: NOKEY, key ID 217521f6
Preparing... ########################################### [100%]
1:epel-release ########################################### [100%]
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
yum install git
Total download size: 7.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): git-1.8.2.1-1.el5. 20% |===== | 1.5 MB 00:12 ETA
安git参看:http://www.letuknowit.com/post/19.html,为何要安?是因为想用它安装PHP的Boris——PHP也有REPL。
演示:http://segmentfault.com/a/1190000000353069
你可以通过 Packagist 来安装 Boris。当然你也可以直接克隆它的 git 仓库:
git clone git://github.com/d11wtq/boris.git
cd boris
./bin/boris
Boris以MIT许可证发布。更多信息请访问Boris在GitHub上的项目主页。
[root@localhost local]# git clone git://github.com/d11wtq/boris.git
Cloning into 'boris'...
remote: Counting objects: 1061, done.
remote: Total 1061 (delta 0), reused 0 (delta 0), pack-reused 1061
Receiving objects: 100% (1061/1061), 204.32 KiB | 62 KiB/s, done.
Resolving deltas: 100% (506/506), done.
[root@localhost local]# cd boris
[root@localhost boris]# ./bin/boris
背景:从某种意义来讲用memcache做缓存已经相当成熟,对于中小型的一些高并发也是可以的,但是伴随微博的兴起(现在好像不行了),有了No-sql这样一种东西出来,但究其从底层来讲和memcache不同在memcache是基于libevent的主进程下用pipe进行通讯的多线程机制,可能是不需要锁的还提供原子锁,而那个redis呢是基于epoll啥的事件驱动的异步的(好像是柱塞的,我再查下:是非阻塞IO ,epoll加自己实现的事件框架,redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁,这块不太明白,反正有利有弊吧,有了锁性能肯定不是太好。)一个单进程在跑,其规避了memcache的全放内存,而是隔一会儿会刷新到那个较为活跃的数据到硬盘里,还支持一部分的数据结构,结构化数据可能会影响其性能,其稳定性和高效来讲,我个人觉得和memcache差不多(mm略高一丝),但对大的粒度的存储来讲,可能mm性能更好,而对于小粒度那当然是redis了,这是因为一个是基于多线程和单进程,二是epoll这玩意好像生来就有这个对大粒度的东西不是太在行,比如:apache之于用epoll写的nginx,对于长时间的重逻辑处理来讲还是apache稳定,至于为什么,这个是实践出来的。获取数据和设置数据在协议上memcache是字符的,redis是二进制???
好了,下载一个最新稳定版本的吧:
http://download.redis.io/releases/redis-3.0.3.tar.gz
http://download.redis.io/releases/redis-stable.tar.gz
解压缩: tar -zxvf redis-3.0.3.tar.gz
cd redis-3.0.3
$ make
$make install
$cp redis.conf /etc/
Q:默认目录:/usr/local/bin 我不想装这儿啊。怎么办?
A:make完 不要install了 手工做
make完了之后,cd utils,里面有个install_server.sh,执行的时候会问你要安装到哪个路径
./install_server.sh
参数介绍:
make install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具
修改系统配置文件,执行命令
a) echo vm.overcommit_memory=1 >> /etc/sysctl.conf
b) sysctl vm.overcommit_memory=1 或执行echo vm.overcommit_memory=1 >>/proc/sys/vm/overcommit_memory
修改redis配置文件
a) $ cd /etc
b) vi redis.conf
c) 修改daemonize yes---目的使进程在后台运行
启动redis
a) $ cd /usr/local/bin
b) ./redis-server /etc/redis.conf
/usr/local/bin/redis-server /etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
7. 检查是否启动成功
a) $ ps -ef | grep redis
果然是单进程且是epoll:
[root@localhost bin]# ps -ef | grep redis
root 317 1 0 17:20 ? 00:00:00 ./redis-server *:6379
[root@localhost bin]# strace -f -p 317
Process 317 attached with 3 threads - interrupt to quit
[pid 325] futex(0x6e6c54, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid 324] futex(0x6e6c24, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid 317] epoll_wait(3, {}, 10128, 3) = 0
[pid 317] open("/proc/317/stat", O_RDONLY) = 6
[pid 317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid 317] close(6) = 0
[pid 317] epoll_wait(3, {}, 10128, 100) = 0
[pid 317] open("/proc/317/stat", O_RDONLY) = 6
[pid 317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid 317] close(6) = 0
[pid 317] epoll_wait(3, {}, 10128, 100) = 0
[pid 317] open("/proc/317/stat", O_RDONLY) = 6
[pid 317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid 317] close(6) = 0
[pid 317] epoll_wait(3, <unfinished ...>
PHP是最好的语言,那安装个PHP扩展,选个自己的PHP版本的扩展:
https://github.com/nicolasff/phpredis/downloads
[root@localhost software]# php -v
PHP 5.3.10 (cli) (built: Jun 4 2013 11:51:25)
Win:https://github.com/downloads/phpredis/phpredis/php_redis-5.3-vc9-ts-73d99c3e.zip
*nix: https://github.com/phpredis/phpredis
https://github.com/phpredis/phpredis/releases
Linux代码 收藏代码
$ tar zxvf nicolasff-phpredis-2.2.2-48-g7dfac44.tar.gz
$ cd nicolasff-phpredis-7dfac44/
$ /usr/local/webserver/php/bin/phpize
$ ./configure --with-php-config=/usr/local/webserver/php/bin/php-config
$ make
$ make install
3 修改php.ini
查看/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613是否有redis.so
[root@localhost phpredis-2.2.7]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
在php.ini中 添加
extension=redis.so
/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/redis.so
[root@localhost phpredis-2.2.7]# php -i|grep php.ini
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
[root@localhost phpredis-2.2.7]# vi /usr/local/php/etc/php.ini
4 重启php进程
$ /usr/local/webserver/php/sbin/php-fpm restart
5 查看phpinfo() 是否有redis扩展
6 用PHP文件测试
Php代码
输出:Hello World
成功!
参考来自:http://alfred-long.iteye.com/blog/1685092
redis server安装部分摘自并参考:http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3117997.html
开机启动,没试过,需要实践:
把上述代码存为redis,放到/etc/init.d/下面
[html] view plaincopy在CODE上查看代码片派生到我的代码片
chmod +x /etc/init.d/redis
设定开机启动服务
sudo chkconfig redis on
启动,停止redis
service redis start #或者 /etc/init.d/redis start
service redis stop #或者 /etc/init.d/redis stop
测试redis
redis-cli
redis 127.0.0.1:6379> set foo 123
OK
redis 127.0.0.1:6379> get foo
"123"
redis 127.0.0.1:6379> exit
好了,下载一个最新稳定版本的吧:
http://download.redis.io/releases/redis-3.0.3.tar.gz
http://download.redis.io/releases/redis-stable.tar.gz
解压缩: tar -zxvf redis-3.0.3.tar.gz
cd redis-3.0.3
$ make
$make install
$cp redis.conf /etc/
Q:默认目录:/usr/local/bin 我不想装这儿啊。怎么办?
A:make完 不要install了 手工做
make完了之后,cd utils,里面有个install_server.sh,执行的时候会问你要安装到哪个路径
./install_server.sh
参数介绍:
make install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具
修改系统配置文件,执行命令
a) echo vm.overcommit_memory=1 >> /etc/sysctl.conf
b) sysctl vm.overcommit_memory=1 或执行echo vm.overcommit_memory=1 >>/proc/sys/vm/overcommit_memory
修改redis配置文件
a) $ cd /etc
b) vi redis.conf
c) 修改daemonize yes---目的使进程在后台运行
启动redis
a) $ cd /usr/local/bin
b) ./redis-server /etc/redis.conf
/usr/local/bin/redis-server /etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
7. 检查是否启动成功
a) $ ps -ef | grep redis
果然是单进程且是epoll:
[root@localhost bin]# ps -ef | grep redis
root 317 1 0 17:20 ? 00:00:00 ./redis-server *:6379
[root@localhost bin]# strace -f -p 317
Process 317 attached with 3 threads - interrupt to quit
[pid 325] futex(0x6e6c54, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid 324] futex(0x6e6c24, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid 317] epoll_wait(3, {}, 10128, 3) = 0
[pid 317] open("/proc/317/stat", O_RDONLY) = 6
[pid 317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid 317] close(6) = 0
[pid 317] epoll_wait(3, {}, 10128, 100) = 0
[pid 317] open("/proc/317/stat", O_RDONLY) = 6
[pid 317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid 317] close(6) = 0
[pid 317] epoll_wait(3, {}, 10128, 100) = 0
[pid 317] open("/proc/317/stat", O_RDONLY) = 6
[pid 317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid 317] close(6) = 0
[pid 317] epoll_wait(3, <unfinished ...>
PHP是最好的语言,那安装个PHP扩展,选个自己的PHP版本的扩展:
https://github.com/nicolasff/phpredis/downloads
[root@localhost software]# php -v
PHP 5.3.10 (cli) (built: Jun 4 2013 11:51:25)
Win:https://github.com/downloads/phpredis/phpredis/php_redis-5.3-vc9-ts-73d99c3e.zip
*nix: https://github.com/phpredis/phpredis
https://github.com/phpredis/phpredis/releases
Linux代码 收藏代码
$ tar zxvf nicolasff-phpredis-2.2.2-48-g7dfac44.tar.gz
$ cd nicolasff-phpredis-7dfac44/
$ /usr/local/webserver/php/bin/phpize
$ ./configure --with-php-config=/usr/local/webserver/php/bin/php-config
$ make
$ make install
3 修改php.ini
查看/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613是否有redis.so
[root@localhost phpredis-2.2.7]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
在php.ini中 添加
extension=redis.so
/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/redis.so
[root@localhost phpredis-2.2.7]# php -i|grep php.ini
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
[root@localhost phpredis-2.2.7]# vi /usr/local/php/etc/php.ini
4 重启php进程
$ /usr/local/webserver/php/sbin/php-fpm restart
5 查看phpinfo() 是否有redis扩展
6 用PHP文件测试
Php代码
输出:Hello World
成功!
参考来自:http://alfred-long.iteye.com/blog/1685092
redis server安装部分摘自并参考:http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3117997.html
开机启动,没试过,需要实践:
把上述代码存为redis,放到/etc/init.d/下面
[html] view plaincopy在CODE上查看代码片派生到我的代码片
chmod +x /etc/init.d/redis
设定开机启动服务
sudo chkconfig redis on
启动,停止redis
service redis start #或者 /etc/init.d/redis start
service redis stop #或者 /etc/init.d/redis stop
测试redis
redis-cli
redis 127.0.0.1:6379> set foo 123
OK
redis 127.0.0.1:6379> get foo
"123"
redis 127.0.0.1:6379> exit
curTempSetTwo
Php/Js/Shell/Go jackxiang 2015-8-18 23:39
背景:做温度比较时有用。
PHP如何比较两个浮点数的大小?
在程序开发中,通常有会涉及到两个大浮点数的比较:如:1.9999999999999999999981.999999999999999999999这样两个大精度的数的比较方法除了以字符串的形式来比较,还有其它方式比较吗?php的bccomp比较出来是相等的。
注意第三个参数
$a = '1.999999999999999999998';
$b = '1.999999999999999999999';
$flag = bccomp($a, $b, 21);
var_dump($flag); // int(-1) 说明b比a大
exit;
From:http://baike.1688.com/doc/view-d35956820.html
PHP如何比较两个浮点数的大小?
在程序开发中,通常有会涉及到两个大浮点数的比较:如:1.9999999999999999999981.999999999999999999999这样两个大精度的数的比较方法除了以字符串的形式来比较,还有其它方式比较吗?php的bccomp比较出来是相等的。
注意第三个参数
$a = '1.999999999999999999998';
$b = '1.999999999999999999999';
$flag = bccomp($a, $b, 21);
var_dump($flag); // int(-1) 说明b比a大
exit;
From:http://baike.1688.com/doc/view-d35956820.html
背景:用树莓派下的chromium调试confirm阻止此页面创建其他对话框的解决方法
用Firefox操作弹出界面时总是遇到“firefox 阻止此页面创建其他对话框”,点击确定后,控制台就会报错误.
解决方法:
1. 在firefox里输入about:config
2. 在列表框里右键->新建->整数
3.输入选项名dom.successive_dialog_time_limit,值设为0,点确认。
用Firefox操作弹出界面时总是遇到“firefox 阻止此页面创建其他对话框”,点击确定后,控制台就会报错误.
解决方法:
1. 在firefox里输入about:config
2. 在列表框里右键->新建->整数
3.输入选项名dom.successive_dialog_time_limit,值设为0,点确认。
echo exec('whoami')
Php/Js/Shell/Go jackxiang 2015-8-17 23:18
echo exec('whoami')
背景:想在树莓派上使用,Raspberry Pi下的chromium没有声音,但在电脑上的FF和Chrome有声音。
Demo:
来自:http://blog.csdn.net/fdipzone/article/details/8170337
Demo:
来自:http://blog.csdn.net/fdipzone/article/details/8170337
vi保存退出命令x和wq的区别
Unix/LinuxC技术 jackxiang 2015-8-14 00:15
每天做得最多的就是用VIM打开文件、保存文件。使用VIM编辑文件时我习惯用'x'命令在保存并退出。而我的一个同事习惯用'wq'命令保存并退出,有一次他问我用'x'和'wq'有什么区别吗?我当时答不出来。
今天我在用'x'命令保存退出时发现了一个有趣的地方,保存退出后有时会显示 "filename" 1L, 10C 已写入 这么一行,有时又不显示。多试了几次才发现在没有修改文件时用'x'命令保存退出时不会显示 "filename" 1L, 10C 已写入 ,文件的修改时间也不会发生变化。有修改时则会显示这一行,而且文件的修改时间也会随之更新。接着我又使用'wq'命令保存退出时终于发现了点问题:不管我是否修改了文件内容,用'wq'命令保存退出时都会显示 "filename" 1L, 10C 已写入 ,并更新文件的修改时间。呵呵原来"x"与"wq"的的真正区别在这里:
wq 强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
x 写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间。
From:http://blog.chinaunix.net/uid-12115233-id-3268894.html
今天我在用'x'命令保存退出时发现了一个有趣的地方,保存退出后有时会显示 "filename" 1L, 10C 已写入 这么一行,有时又不显示。多试了几次才发现在没有修改文件时用'x'命令保存退出时不会显示 "filename" 1L, 10C 已写入 ,文件的修改时间也不会发生变化。有修改时则会显示这一行,而且文件的修改时间也会随之更新。接着我又使用'wq'命令保存退出时终于发现了点问题:不管我是否修改了文件内容,用'wq'命令保存退出时都会显示 "filename" 1L, 10C 已写入 ,并更新文件的修改时间。呵呵原来"x"与"wq"的的真正区别在这里:
wq 强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
x 写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间。
From:http://blog.chinaunix.net/uid-12115233-id-3268894.html
首先,用 telnet 链接WEB服务器:
telnet 172.21.73.12 80
键入下面两行命令,然后回车2次,即可得到HTTP响应(下面的命令是get index.html文件,请根据你测试的server的实际情况修改这个参数)。
GET /index.html HTTP/1.1
host:172.21.73.12:80 #如果IP就能访问到,不需要虚拟域名,则可以不写host这行,直接两次回车即可。
响应的结果如下所示:
HTTP/1.1 200 OK
Date: Thu, 30 Jul 2009 03:42:18 GMT
Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch5~pu1 mod_perl/2.0.2 Perl/v5.8.8
Last-Modified: Thu, 30 Jul 2009 03:21:07 GMT
ETag: "320692-19e-cb5d6ec0"
Accept-Ranges: bytes
Content-Length: 414
Content-Type: text/html; charset=UTF-8
来自:http://blog.chinaunix.net/uid-20644632-id-68039.html
可以用来排查一下那个网路的问题:
——————————————————————————————
实践OK如下:
不用这么复杂,但有一个问题,用telnet手打的话就写个 GET / 就好了
这host没有设置,访问默认到ip了: curl -H"Host:jackxiang.com" ...怎么体现在telnet里:
得用ip去连接后,写Host才行,如下:
=================================================================================
Telnet Post/Get 实现方式:
Get方式
1. telnet 192.168.1.110 80,连接上之后。
2.
windows doc命令行下:ctrl键 + ']' 键 进入输入模式,接着按回车切换到显式输入模式(可以显示输入的字符)
linux命令行则不需要此此操作。
3. 输入http头部,两次回车(\r\n)。
GET /api.do?user=charlie&pwd=w2ss42 HTTP/1.0
Content-Type: text/html; charset=UTF-8
POST方式
1. telnet 192.168.1.110 80,连接上之后。
2. 同上。
3. 输入http头部,两次回车(\r\n),接着输入post参数。
POST /api.do HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
user=charlid&pwd=w2ss42
POST/GET 来自:http://blog.csdn.net/xiongli880612/article/details/40300861
来源2:http://blog.csdn.net/fym0121/article/details/7647887
==========================一个哥们是IOS上这样就行,我发现不行======================================
http GET http://jackxiang.com GET必须大写,否则返回:400 Bad Request:
本文转载自:http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html
1、打开"运行"->cmd进入命令环境;
2、输入"telnet www.baidu.com 80",回车后 ,屏幕为全黑,此时我们利用快捷键"Ctrl+](右中括号)"来打开本地回显功能,这样我们就可以看见我们所打的东西了,如图:(注本阶段执行过程和以下的过程均要求操作时间尽可能短,因为时间一长,便会被认为断开连接。)
3、单击回车,进行编辑状态。
4、输入:"GET / HTTP/1.1"后回车,在第二段接着输入:"HOST:"然后按回车,这样一个简单的HTTP请求就完成了,接着我人只要再按下回车,便向服务器递交这个请求了。如图:(我们来看一下这个是什么意思:GET表示请求方式,/表示请求的根目录下的文件,HTTP/1.1表示HTTP协议版本,HOST就是一个消息头,据某些朋友说1.1的版本一定要加一个"HOST:"可是我实验后发现"HOST :"不加仍旧可以正常发送请求,但是GET HTTP这个必须大写,否则就该请求无法发送)
5、接收服务器返回,这步其实不需要我们来做,因为当我们发送请求后,只需几秒钟,我们便会收到来自服务器反应.
6、这样,请求就算完成了。下面我们在百度中搜一下"1",浏览器中的地址应该是:http://www.baidu.com/s?wd=1.看看请求是怎么样的
怎么样,大家会了吗?以上只是用GET方式进行请求,当然还可以用POST方式进行请求,只是POST我这不方便做实验,所以就不写了。大概的格式给大家参考下:
POST /localhost/login.aspx HTTP/1.1
HOST:
Content-Type:application/x-www-form-urlencoded
Content-Length:10
uid=xxxxxx
telnet 172.21.73.12 80
键入下面两行命令,然后回车2次,即可得到HTTP响应(下面的命令是get index.html文件,请根据你测试的server的实际情况修改这个参数)。
GET /index.html HTTP/1.1
host:172.21.73.12:80 #如果IP就能访问到,不需要虚拟域名,则可以不写host这行,直接两次回车即可。
响应的结果如下所示:
HTTP/1.1 200 OK
Date: Thu, 30 Jul 2009 03:42:18 GMT
Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch5~pu1 mod_perl/2.0.2 Perl/v5.8.8
Last-Modified: Thu, 30 Jul 2009 03:21:07 GMT
ETag: "320692-19e-cb5d6ec0"
Accept-Ranges: bytes
Content-Length: 414
Content-Type: text/html; charset=UTF-8
来自:http://blog.chinaunix.net/uid-20644632-id-68039.html
可以用来排查一下那个网路的问题:
——————————————————————————————
实践OK如下:
不用这么复杂,但有一个问题,用telnet手打的话就写个 GET / 就好了
这host没有设置,访问默认到ip了: curl -H"Host:jackxiang.com" ...怎么体现在telnet里:
得用ip去连接后,写Host才行,如下:
=================================================================================
Telnet Post/Get 实现方式:
Get方式
1. telnet 192.168.1.110 80,连接上之后。
2.
windows doc命令行下:ctrl键 + ']' 键 进入输入模式,接着按回车切换到显式输入模式(可以显示输入的字符)
linux命令行则不需要此此操作。
3. 输入http头部,两次回车(\r\n)。
GET /api.do?user=charlie&pwd=w2ss42 HTTP/1.0
Content-Type: text/html; charset=UTF-8
POST方式
1. telnet 192.168.1.110 80,连接上之后。
2. 同上。
3. 输入http头部,两次回车(\r\n),接着输入post参数。
POST /api.do HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
user=charlid&pwd=w2ss42
POST/GET 来自:http://blog.csdn.net/xiongli880612/article/details/40300861
来源2:http://blog.csdn.net/fym0121/article/details/7647887
==========================一个哥们是IOS上这样就行,我发现不行======================================
http GET http://jackxiang.com GET必须大写,否则返回:400 Bad Request:
本文转载自:http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html
1、打开"运行"->cmd进入命令环境;
2、输入"telnet www.baidu.com 80",回车后 ,屏幕为全黑,此时我们利用快捷键"Ctrl+](右中括号)"来打开本地回显功能,这样我们就可以看见我们所打的东西了,如图:(注本阶段执行过程和以下的过程均要求操作时间尽可能短,因为时间一长,便会被认为断开连接。)
3、单击回车,进行编辑状态。
4、输入:"GET / HTTP/1.1"后回车,在第二段接着输入:"HOST:"然后按回车,这样一个简单的HTTP请求就完成了,接着我人只要再按下回车,便向服务器递交这个请求了。如图:(我们来看一下这个是什么意思:GET表示请求方式,/表示请求的根目录下的文件,HTTP/1.1表示HTTP协议版本,HOST就是一个消息头,据某些朋友说1.1的版本一定要加一个"HOST:"可是我实验后发现"HOST :"不加仍旧可以正常发送请求,但是GET HTTP这个必须大写,否则就该请求无法发送)
5、接收服务器返回,这步其实不需要我们来做,因为当我们发送请求后,只需几秒钟,我们便会收到来自服务器反应.
6、这样,请求就算完成了。下面我们在百度中搜一下"1",浏览器中的地址应该是:http://www.baidu.com/s?wd=1.看看请求是怎么样的
怎么样,大家会了吗?以上只是用GET方式进行请求,当然还可以用POST方式进行请求,只是POST我这不方便做实验,所以就不写了。大概的格式给大家参考下:
POST /localhost/login.aspx HTTP/1.1
HOST:
Content-Type:application/x-www-form-urlencoded
Content-Length:10
uid=xxxxxx
[实践OK] C语言-循环队列的简单实现
Unix/LinuxC技术 jackxiang 2015-8-7 11:37
用C语言实现一个循环队列并不难。关键点在于对队列 "空" 和 "满" 状态的判断。
正如《C和指针》中所描写的,有两种方法来实现对队列空和满状态的判断。
在数组中空一个元素不填,起始时, 置tail为0, front为1, 这样一来, 实现要浪费queue buffer中两个元素空间:
队列空: (tail+1) % queue_size == front
队列满: (tail+2) % queue_size == front
定义一个变量来记录队列中元素的个数, 判断队列的空和满直接看变量的值即可
本文中使用的是第2种:
来自:http://blog.csdn.net/huangkangying/article/details/44066729
正如《C和指针》中所描写的,有两种方法来实现对队列空和满状态的判断。
在数组中空一个元素不填,起始时, 置tail为0, front为1, 这样一来, 实现要浪费queue buffer中两个元素空间:
队列空: (tail+1) % queue_size == front
队列满: (tail+2) % queue_size == front
定义一个变量来记录队列中元素的个数, 判断队列的空和满直接看变量的值即可
本文中使用的是第2种:
来自:http://blog.csdn.net/huangkangying/article/details/44066729
背景:公司服务器存的ftp是utf-8,用那个leapftp打开是乱码,如何让leapftp支持UTF-8编码?
leapftp 通过发送命令 可以将服务器的乱码识别为正常编码:
登录乱码服务器;
随意点击服务器上任意乱码文件或目录;
按键盘CTRL+R 弹出对话框;
输入opts utf8 off 点击确定;(需勾选完成时刷新选项)
服务器会从乱码态转为正常可识别状态;
缺点:每次登陆都需要敲入这个命令,但是对于下载已经没有影响了;
以上实践OK。
leapftp 通过发送命令 可以将服务器的乱码识别为正常编码:
登录乱码服务器;
随意点击服务器上任意乱码文件或目录;
按键盘CTRL+R 弹出对话框;
输入opts utf8 off 点击确定;(需勾选完成时刷新选项)
服务器会从乱码态转为正常可识别状态;
缺点:每次登陆都需要敲入这个命令,但是对于下载已经没有影响了;
以上实践OK。
[实践OK]在vim的状态栏显示 当前行所在的函数名字,vim里一个函数很长(几百行),光标在函数中间的某个位置,怎么快速跳到函数头?ctrl + o 回到光标回到上次位置,及命令模式下跳转到某行。
Unix/LinuxC技术 jackxiang 2015-8-5 11:57
在 .vimrc里添加:
按一下 f 键就能显示函数名字。
来自:http://blog.csdn.net/caspiansea/article/details/42570311
vim里一个函数很长(几百行),光标在函数中间的某个位置,怎么快速跳到函数头?
[]
是跳到函数头。[ 是 p 右侧那个键。
正常模式
跳到头
[[
跳到尾
][
跳到下一个函数
]]
调到上一个函数
[]
调到上一层大括号
[{
ctrl + o 回到光标回到上次位置:
ESC下面那个按两下也可以实现
命令模式下跳转到某行:
比如开始在第n行,然后用mG后,跳到了m行,
按一下 f 键就能显示函数名字。
来自:http://blog.csdn.net/caspiansea/article/details/42570311
vim里一个函数很长(几百行),光标在函数中间的某个位置,怎么快速跳到函数头?
[]
是跳到函数头。[ 是 p 右侧那个键。
正常模式
跳到头
[[
跳到尾
][
跳到下一个函数
]]
调到上一个函数
[]
调到上一层大括号
[{
ctrl + o 回到光标回到上次位置:
ESC下面那个按两下也可以实现
命令模式下跳转到某行:
比如开始在第n行,然后用mG后,跳到了m行,
技术创新持续进行、速度不断加快,企业竞争优势主要来自创新。随着科技的日新月异,人们的生活节奏越来越快以及对个性的追求,产品的生命周期不断缩短。
顾客需求瞬息万变,产品周期不断缩短。在知识经济时代,那种”生产什么就卖什么”的时代已经一去不复返了。如今的”买方市场”使顾客的选择范围大大拓宽,也使得他们对产品的期望值在不断提高,他们不再满足于合理的价格,而且还要追求产品的个性化,企业往往要根据顾客的需求”量体裁衣”。
于是顾客不再有耐心为某一种产品而长时间地等待了。 企业如果不能即时对市场需求变化做出快速响应,不能在短时间内开发、生产并销售出其产品,企业就会被淘汰出局,SO,中小企业如雨后春笋,进行专业化灵活多便的生产或服务,并以其低成本运营对规模化企业高成本运营直接产生竞争威胁。
目前,不求最好,但求最贵的公司,设备该上的都上了,事故该来的仍然会来,使用第三方企业提供的解决方案未必靠谱,昂贵的硬件与软件投资并没有为创造出应有的价值。为什么?在我看来,是因为硬件软件分离太久用户行为思维习惯审美发生了大变化,在天下大势,分久必合,合久必分的必然演变下以合为主要潮流,鉴于此背景,我们也必须要顺应潮流,把整个软硬件的链条拉长并牢牢的控制在我们手中,这不是不可能,现在软件硬件的技术已然成熟不再是难点问题而最多的是利用这一整套结构体系去满足用户的迁移和品味的变化,同时,这个潮流不是迅速就来就过而是一个循序渐进的过程,这也就是为何慢也没关系再就是硬件的研发本来就慢,即便如此,我们出发时就要在整个链条上贯穿上我们自己的兄弟,势必完整把握住灵活构建出软硬件一体化的根本原因所在。
————————————————————————————————————————————————————————————————
警惕IT黑洞
什么是IT黑洞
IT黑洞是指企业在利用信息技术进行经营管理时,巨额的软硬件或软件投资并不能给企业带来预期的管理效率,企业在这方面的投资好像陷入一个“黑洞”的现象。
产生IT黑洞原因是,运维管理层没有能力解决生产中遇到的问题,害怕承担责任,从而将风险转嫁给第三方。试图说服企业,上了这些硬件就能保证生产安全稳定。
如此一来IT预算成倍增长,企业几乎将所有的技术都应用的生产环境中。
使用最新的防火墙,转发能力最强的路由器,吞吐最强的交换机,昂贵的负载均衡,高大上的SAN区域存储,去重复压缩备份,实时备份与恢复,主流的服务器甚至小型机。
我曾经写过一个段子调侃一下IT黑洞:
要是咱做首席架构师
一定要的选Java
选最好的五星级机房
万兆骨干以太网直接接入
至少百十来个机柜吧
什么防火墙,路由器,交换机,负载均衡呀
能给他接的全给他接上
楼上有健身房,楼内有游戏室
一进门儿,甭管有事儿没事儿都得跟人家说
may i help you sir?
一口地道的英国伦敦腔儿
倍儿有面子
什么 hibernate, structs, spring,ActiveMQ 全都给我装上
别说代码多少行,光 xml 配置文件就100M多兆
一个 EMC 存储放那儿, 干啥, 存储Log4J的日志
一年服务费就得几万美金
这样一个系统, 你猜得多少码农开发, 得, 光累死的就10好几个
这样的系统能用吗? 当然不能
你还得找个外包公司, 一打 Application Server管理员, 18M认证的那种 , 24*365
在招聘几十个运维的,二十四小时候着
系统光启动就得好几天
周围的公司不是Hadoop就是BigTable
你要是用PHP, MySQL都不好意思跟人家打招呼
就是一个字儿---“贵”
一天的网络流量得花个万八千的
你说这样的开发,码畜一天的多少钱
我觉得怎么着也得四千美金吧
四千美金?!那是成本
八千美金起
你别嫌贵,还不打折
你得研究老板的心理
愿意掏几千美金租五星级机房的企业
根本不在乎再多掏两千
什么叫土豪企业你知道吗?
土豪企业就是
买什么东西都买最贵的,不买最好的
所以,我们做项目的口号就是
不求最好,但求最贵.
设备该上的都上了,事故该来的仍然会来,使用第三方企业提供的解决方案未必靠谱,昂贵的硬件与软件投资并没有为创造出应有的价值。
起初IBM,EMC,VMware,Oracle,Microsoft,SAP 等等企业针对不同行业提出很多解决方案,例如ERP,CRM,零售业,航空业解决方案等等。 传统行业经过半个世纪发展,提炼,已经有一个完整、完善、科学的管理方法,流程明确,如制造业有ISO标准,这些软件企业经过漫长需求收集整理最终针对不同行业开发出完善的产品与行业解决方案。 这些方案在传统企业是成功的,我们可以看到IBM,SAP,Oracle在各种传统行业取得了辉煌的成功。
然而,进入90年代,这种传统企业管理模式越来越跟不上时代的步伐,新经济时代的到来致使企业所处的时代背景和竞争环境发生了根本性的变化。 软件供应商的传统解决方案也不适合当下的企业,日益显露出其弊端。传统软件开发方式,一年过半年发布一个版本已经不能适应互联网时代,我们需要一周甚至每天一个版本。尤其在当前中国互联网大环境下,每天可能频繁更新数个版本到生产环境。
技术创新持续进行、速度不断加快,企业竞争优势主要来自创新。随着科技的日新月异,人们的生活节奏越来越快以及对个性的追求,产品的生命周期不断缩短。 与工业经济时代不同,创新(Innovation)成为知识经济时代的首要目标。人们通过有计划的、连续不断的创新来赢得市场的竞争优势。 也就是说在知识经济时代创新不再具有一定的阶段性,产品变化不再具有相对稳定性的特点,从而企业通过将产品生产分解再分解,使生产的每一步骤规范化和简单化,并通过规模化大生产降低生产成本,获得市场竞争优势的历史成为过去。
顾客需求瞬息万变,产品周期不断缩短。在知识经济时代,那种”生产什么就卖什么”的时代已经一去不复返了。如今的”买方市场”使顾客的选择范围大大拓宽,也使得他们对产品的期望值在不断提高,他们不再满足于合理的价格,而且还要追求产品的个性化,企业往往要根据顾客的需求”量体裁衣”。同时,市场竞争加剧,大量的替代产品使得任何一家企业都无法垄断市场,而贸易壁垒的取消还意味着顾客不仅仅可以从本国产品还能从外国产品中寻求其最佳利益,于是顾客不再有耐心为某一种产品而长时间地等待了。 企业如果不能即时对市场需求变化做出快速响应,不能在短时间内开发、生产并销售出其产品,企业就会被淘汰出局。
竞争空间不断扩大,激烈程度不断加剧。随着全球经济一体化,企业竞争将不再受地域限制,任何企业都要承受来自国际化企业发展的竞争压力。另一方面,中小企业如雨后春笋,进行专业化灵活多便的生产或服务,并以其低成本运营对规模化企业高成本运营直接产生竞争威胁。
IT黑洞产生的原因分析
人的因素
企业重管理,轻技术。趋向于管理层把人管好,而不是充分授权技术人员,重视技术研发。
管理层没有能力解决生产中遇到的问题
害怕承担责任,如果在生产环境使用MySQL出了问题怎么办,谁能承担责任?不如使用Oracle,出现问题厂家上门解决,将责任转嫁给厂商。
求稳心态,不做事就不会出事,不要在我任上出事,评价下属工作的标准是办事的准确度如何,任何冒险与创新的行为都是不受欢迎的。 因此极大地抑制了成员自我决策的积极性与创造性。导致员工技能单一,适应性差,员工缺乏积极性、主动性、责任感差,致使工作和服务质量下降。
来自组织架构的问题
传统的企业组织理论告诉我们,当组织规模扩大到一定程度,必须通过增加管理层次来保证有效领导。在企业规模一定的情况下,管理幅度与管理层次成反比。当企业发展到一定规模后,这种管理体制的弊端就突显出来。
组织层次过多,各部门按专业职能划分,组织机构臃肿,助长官僚作风 这些都是出现IT黑洞的主要原因。各部门只关心本部门的工作,并以达到上级部门满意为准,缺乏合作与服务意识。 各部门往往会从自己局部的利益出发,精心构思自己的行为,使自己的目标凌驾于整个组织的目标之上。这种分散主义和利益分歧,或许能够实现局部利益的提高,但却弱化了整个组织的功效。
延伸阅读《Netkiller 系列 手札》
作者
陈景峰,昵称 Netkiller, 英文名 Neo 《Netkiller 系列 手札》电子书的作者,读者QQ群:128659835,个人网站:http://netkiller.github.io/
转载请注明出处与作者声明
2015-8-4
顾客需求瞬息万变,产品周期不断缩短。在知识经济时代,那种”生产什么就卖什么”的时代已经一去不复返了。如今的”买方市场”使顾客的选择范围大大拓宽,也使得他们对产品的期望值在不断提高,他们不再满足于合理的价格,而且还要追求产品的个性化,企业往往要根据顾客的需求”量体裁衣”。
于是顾客不再有耐心为某一种产品而长时间地等待了。 企业如果不能即时对市场需求变化做出快速响应,不能在短时间内开发、生产并销售出其产品,企业就会被淘汰出局,SO,中小企业如雨后春笋,进行专业化灵活多便的生产或服务,并以其低成本运营对规模化企业高成本运营直接产生竞争威胁。
目前,不求最好,但求最贵的公司,设备该上的都上了,事故该来的仍然会来,使用第三方企业提供的解决方案未必靠谱,昂贵的硬件与软件投资并没有为创造出应有的价值。为什么?在我看来,是因为硬件软件分离太久用户行为思维习惯审美发生了大变化,在天下大势,分久必合,合久必分的必然演变下以合为主要潮流,鉴于此背景,我们也必须要顺应潮流,把整个软硬件的链条拉长并牢牢的控制在我们手中,这不是不可能,现在软件硬件的技术已然成熟不再是难点问题而最多的是利用这一整套结构体系去满足用户的迁移和品味的变化,同时,这个潮流不是迅速就来就过而是一个循序渐进的过程,这也就是为何慢也没关系再就是硬件的研发本来就慢,即便如此,我们出发时就要在整个链条上贯穿上我们自己的兄弟,势必完整把握住灵活构建出软硬件一体化的根本原因所在。
————————————————————————————————————————————————————————————————
警惕IT黑洞
什么是IT黑洞
IT黑洞是指企业在利用信息技术进行经营管理时,巨额的软硬件或软件投资并不能给企业带来预期的管理效率,企业在这方面的投资好像陷入一个“黑洞”的现象。
产生IT黑洞原因是,运维管理层没有能力解决生产中遇到的问题,害怕承担责任,从而将风险转嫁给第三方。试图说服企业,上了这些硬件就能保证生产安全稳定。
如此一来IT预算成倍增长,企业几乎将所有的技术都应用的生产环境中。
使用最新的防火墙,转发能力最强的路由器,吞吐最强的交换机,昂贵的负载均衡,高大上的SAN区域存储,去重复压缩备份,实时备份与恢复,主流的服务器甚至小型机。
我曾经写过一个段子调侃一下IT黑洞:
要是咱做首席架构师
一定要的选Java
选最好的五星级机房
万兆骨干以太网直接接入
至少百十来个机柜吧
什么防火墙,路由器,交换机,负载均衡呀
能给他接的全给他接上
楼上有健身房,楼内有游戏室
一进门儿,甭管有事儿没事儿都得跟人家说
may i help you sir?
一口地道的英国伦敦腔儿
倍儿有面子
什么 hibernate, structs, spring,ActiveMQ 全都给我装上
别说代码多少行,光 xml 配置文件就100M多兆
一个 EMC 存储放那儿, 干啥, 存储Log4J的日志
一年服务费就得几万美金
这样一个系统, 你猜得多少码农开发, 得, 光累死的就10好几个
这样的系统能用吗? 当然不能
你还得找个外包公司, 一打 Application Server管理员, 18M认证的那种 , 24*365
在招聘几十个运维的,二十四小时候着
系统光启动就得好几天
周围的公司不是Hadoop就是BigTable
你要是用PHP, MySQL都不好意思跟人家打招呼
就是一个字儿---“贵”
一天的网络流量得花个万八千的
你说这样的开发,码畜一天的多少钱
我觉得怎么着也得四千美金吧
四千美金?!那是成本
八千美金起
你别嫌贵,还不打折
你得研究老板的心理
愿意掏几千美金租五星级机房的企业
根本不在乎再多掏两千
什么叫土豪企业你知道吗?
土豪企业就是
买什么东西都买最贵的,不买最好的
所以,我们做项目的口号就是
不求最好,但求最贵.
设备该上的都上了,事故该来的仍然会来,使用第三方企业提供的解决方案未必靠谱,昂贵的硬件与软件投资并没有为创造出应有的价值。
起初IBM,EMC,VMware,Oracle,Microsoft,SAP 等等企业针对不同行业提出很多解决方案,例如ERP,CRM,零售业,航空业解决方案等等。 传统行业经过半个世纪发展,提炼,已经有一个完整、完善、科学的管理方法,流程明确,如制造业有ISO标准,这些软件企业经过漫长需求收集整理最终针对不同行业开发出完善的产品与行业解决方案。 这些方案在传统企业是成功的,我们可以看到IBM,SAP,Oracle在各种传统行业取得了辉煌的成功。
然而,进入90年代,这种传统企业管理模式越来越跟不上时代的步伐,新经济时代的到来致使企业所处的时代背景和竞争环境发生了根本性的变化。 软件供应商的传统解决方案也不适合当下的企业,日益显露出其弊端。传统软件开发方式,一年过半年发布一个版本已经不能适应互联网时代,我们需要一周甚至每天一个版本。尤其在当前中国互联网大环境下,每天可能频繁更新数个版本到生产环境。
技术创新持续进行、速度不断加快,企业竞争优势主要来自创新。随着科技的日新月异,人们的生活节奏越来越快以及对个性的追求,产品的生命周期不断缩短。 与工业经济时代不同,创新(Innovation)成为知识经济时代的首要目标。人们通过有计划的、连续不断的创新来赢得市场的竞争优势。 也就是说在知识经济时代创新不再具有一定的阶段性,产品变化不再具有相对稳定性的特点,从而企业通过将产品生产分解再分解,使生产的每一步骤规范化和简单化,并通过规模化大生产降低生产成本,获得市场竞争优势的历史成为过去。
顾客需求瞬息万变,产品周期不断缩短。在知识经济时代,那种”生产什么就卖什么”的时代已经一去不复返了。如今的”买方市场”使顾客的选择范围大大拓宽,也使得他们对产品的期望值在不断提高,他们不再满足于合理的价格,而且还要追求产品的个性化,企业往往要根据顾客的需求”量体裁衣”。同时,市场竞争加剧,大量的替代产品使得任何一家企业都无法垄断市场,而贸易壁垒的取消还意味着顾客不仅仅可以从本国产品还能从外国产品中寻求其最佳利益,于是顾客不再有耐心为某一种产品而长时间地等待了。 企业如果不能即时对市场需求变化做出快速响应,不能在短时间内开发、生产并销售出其产品,企业就会被淘汰出局。
竞争空间不断扩大,激烈程度不断加剧。随着全球经济一体化,企业竞争将不再受地域限制,任何企业都要承受来自国际化企业发展的竞争压力。另一方面,中小企业如雨后春笋,进行专业化灵活多便的生产或服务,并以其低成本运营对规模化企业高成本运营直接产生竞争威胁。
IT黑洞产生的原因分析
人的因素
企业重管理,轻技术。趋向于管理层把人管好,而不是充分授权技术人员,重视技术研发。
管理层没有能力解决生产中遇到的问题
害怕承担责任,如果在生产环境使用MySQL出了问题怎么办,谁能承担责任?不如使用Oracle,出现问题厂家上门解决,将责任转嫁给厂商。
求稳心态,不做事就不会出事,不要在我任上出事,评价下属工作的标准是办事的准确度如何,任何冒险与创新的行为都是不受欢迎的。 因此极大地抑制了成员自我决策的积极性与创造性。导致员工技能单一,适应性差,员工缺乏积极性、主动性、责任感差,致使工作和服务质量下降。
来自组织架构的问题
传统的企业组织理论告诉我们,当组织规模扩大到一定程度,必须通过增加管理层次来保证有效领导。在企业规模一定的情况下,管理幅度与管理层次成反比。当企业发展到一定规模后,这种管理体制的弊端就突显出来。
组织层次过多,各部门按专业职能划分,组织机构臃肿,助长官僚作风 这些都是出现IT黑洞的主要原因。各部门只关心本部门的工作,并以达到上级部门满意为准,缺乏合作与服务意识。 各部门往往会从自己局部的利益出发,精心构思自己的行为,使自己的目标凌驾于整个组织的目标之上。这种分散主义和利益分歧,或许能够实现局部利益的提高,但却弱化了整个组织的功效。
延伸阅读《Netkiller 系列 手札》
作者
陈景峰,昵称 Netkiller, 英文名 Neo 《Netkiller 系列 手札》电子书的作者,读者QQ群:128659835,个人网站:http://netkiller.github.io/
转载请注明出处与作者声明
2015-8-4
Linux下查看在线用户
Unix/LinuxC技术 jackxiang 2015-8-4 22:38
背景:尽管登录vps会发邮件,但是会偶出现,登录了又发了一邮件,于是想此时看到底有多少个终端在登录态,还是阿里的alikid触发,还是真有黑客,怎么办,w查看,w tux。
LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务。系统管理员可以随时了解系统中有那些用户,用户都在进行什么操作。
查看用户的操作
系统管理员若想知道某一时刻用户的行为,只需要输入命令w即可,在SHELL终端中输入如下命令:
tux@tux-desktop:~$ w
21:13:14 up 7:08, 2 users, load average: 0.22, 0.32, 0.20
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tux tty7 :0 14:05 ? 37:55 0.33s x-session-manag
tux pts/1 :0.0 21:13 0.00s 0.13s 0.00s w
可以看到执行W命令及显示结果。
命令信息含义
上述显示的信息分别表示如下:
第一行显示系统的汇总信息,字段分别表示系统当前时间、系统运行时间、登陆哟内用户总数及系统平均负载信息。对于上述势力中的几个显示数据意义为:
21:13:14 表示执行W的时间是在晚上9点13分。
7:08 表示系统运行7小时8分。
2 users 表示当前系统登陆用户总数为2。
load average与后面的数字一起表示系统在过去1,5,10分钟内的负载程度,数值越小,系统负载越轻。
从第二行开始构成一个表格,共有8个栏目,分别显示各个用户正在做的事情及该用户所占用的系统资料。
USER:显示登陆用户帐号名。用户重复登陆,该帐号也会重复出现。
TTY:用户登陆所用的终端。
FROM:显示用户在何处登陆系统。
LOGIN@:是LOGIN AT的意思,表示登陆进入系统的时间。
IDLE:用户空闲时间,从用户上一次任务结束后,开会记时。
JCPU:一终端代号来区分,表示在摸段时间内,所有与该终端相关的进程任务所耗费的CPU时间。
PCPU:指WHAT域的任务执行后耗费的CPU时间。
WHAT:表示当前执行的任务。
查看某用户
当登陆系统用户很多的时候,可以在W后面加上某个用户名,则会查看该用户执行任务的情况。
tux@tux-desktop:~$ w tux
21:19:01 up 7:14, 2 users, load average: 0.25, 0.21, 0.18
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tux tty7 :0 14:05 ? 38:05 0.33s x-session-manag
tux pts/1 :0.0 21:13 0.00s 0.13s 0.00s w tux
默认情况下,系统会显示上述所有的信息,如果只关心某一方面,可以只使用相关的选项。
LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务。系统管理员可以随时了解系统中有那些用户,用户都在进行什么操作。
查看用户的操作
系统管理员若想知道某一时刻用户的行为,只需要输入命令w即可,在SHELL终端中输入如下命令:
tux@tux-desktop:~$ w
21:13:14 up 7:08, 2 users, load average: 0.22, 0.32, 0.20
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tux tty7 :0 14:05 ? 37:55 0.33s x-session-manag
tux pts/1 :0.0 21:13 0.00s 0.13s 0.00s w
可以看到执行W命令及显示结果。
命令信息含义
上述显示的信息分别表示如下:
第一行显示系统的汇总信息,字段分别表示系统当前时间、系统运行时间、登陆哟内用户总数及系统平均负载信息。对于上述势力中的几个显示数据意义为:
21:13:14 表示执行W的时间是在晚上9点13分。
7:08 表示系统运行7小时8分。
2 users 表示当前系统登陆用户总数为2。
load average与后面的数字一起表示系统在过去1,5,10分钟内的负载程度,数值越小,系统负载越轻。
从第二行开始构成一个表格,共有8个栏目,分别显示各个用户正在做的事情及该用户所占用的系统资料。
USER:显示登陆用户帐号名。用户重复登陆,该帐号也会重复出现。
TTY:用户登陆所用的终端。
FROM:显示用户在何处登陆系统。
LOGIN@:是LOGIN AT的意思,表示登陆进入系统的时间。
IDLE:用户空闲时间,从用户上一次任务结束后,开会记时。
JCPU:一终端代号来区分,表示在摸段时间内,所有与该终端相关的进程任务所耗费的CPU时间。
PCPU:指WHAT域的任务执行后耗费的CPU时间。
WHAT:表示当前执行的任务。
查看某用户
当登陆系统用户很多的时候,可以在W后面加上某个用户名,则会查看该用户执行任务的情况。
tux@tux-desktop:~$ w tux
21:19:01 up 7:14, 2 users, load average: 0.25, 0.21, 0.18
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tux tty7 :0 14:05 ? 38:05 0.33s x-session-manag
tux pts/1 :0.0 21:13 0.00s 0.13s 0.00s w tux
默认情况下,系统会显示上述所有的信息,如果只关心某一方面,可以只使用相关的选项。
http://mp.weixin.qq.com/s?__biz=MzAxNjAzMTQyMA==&mid=204468062&idx=1&sn=bfafd45d802964c8b4636841a38011d1&scene=5&ptlang=2052&ADUIN=372647693&ADSESSION=1438218622&ADTAG=CLIENT.QQ.5425_.0&ADPUBNO=26505#rd