文件大小是这个文件的实际大小,占用空间是这个文件占用的硬盘空间。它们之间会存在差异,比如一个文件占用半个格子,那么另半个格子也算在这个文件了。
——————————————————————
文件大小,同一个文件在Windows下的大小和在Unix下的大小
这里拿文本文件来看,在windows下面可以看文件的属性在文件的大小那里会显示文件有多少字节
在Unix下面可以通过"ls -l" 来看,二者大小是否相等呢?
取决于文件怎么在二者间传递的,
如果使用ftp来传文件(文件里面有很多字符,包括回车、换行等等),则分下面两种情况
一:使用ASCII传输类型
同一个文件在两个系统里面大小不一样,但是文件的内容一样
二:使用二进制传输类型
同一个文件在两个系统里面大小一样,但是文件的内容不一样了,回车在Unix下面看到的是^M
关于文件的占用空间问题
一:在windows下面新建一个文本文件,里面只有一个字符,查看其占用空间结果为4KB
二:在Unix下面新建一个文本文件,同样只输入一个字符,查看其占用空间"du -k file"结果为4KB
这里的4K即有簇的概念,又有block size的概念在里面,这个值可以自己定义的,大小根据具体的应用来定,定的大效能在某些情况下会很好,但是容易浪费空间....
来自:http://blog.chinaunix.net/uid-20652643-id-1906388.html
——————————————————————
文件大小,同一个文件在Windows下的大小和在Unix下的大小
这里拿文本文件来看,在windows下面可以看文件的属性在文件的大小那里会显示文件有多少字节
在Unix下面可以通过"ls -l" 来看,二者大小是否相等呢?
取决于文件怎么在二者间传递的,
如果使用ftp来传文件(文件里面有很多字符,包括回车、换行等等),则分下面两种情况
一:使用ASCII传输类型
同一个文件在两个系统里面大小不一样,但是文件的内容一样
二:使用二进制传输类型
同一个文件在两个系统里面大小一样,但是文件的内容不一样了,回车在Unix下面看到的是^M
关于文件的占用空间问题
一:在windows下面新建一个文本文件,里面只有一个字符,查看其占用空间结果为4KB
二:在Unix下面新建一个文本文件,同样只输入一个字符,查看其占用空间"du -k file"结果为4KB
这里的4K即有簇的概念,又有block size的概念在里面,这个值可以自己定义的,大小根据具体的应用来定,定的大效能在某些情况下会很好,但是容易浪费空间....
来自:http://blog.chinaunix.net/uid-20652643-id-1906388.html
背景:密码太薄弱,出现了渗透,密码得强是关键。
http://www.wooyun.org/bugs/wooyun-2010-079283/auth/2da5f25fa479357867f7ac7ab746b33f?lan=cn&lan=cn&lan=cn
结论:问题还是出在admin admin上面呀。。。。而且现在普通的md5加密已经没啥安全性了,必须加字符串,或2次md5才行啊。。。
http://www.wooyun.org/bugs/wooyun-2010-079283/auth/2da5f25fa479357867f7ac7ab746b33f?lan=cn&lan=cn&lan=cn
结论:问题还是出在admin admin上面呀。。。。而且现在普通的md5加密已经没啥安全性了,必须加字符串,或2次md5才行啊。。。
CentOS 7 正式版发布
Unix/LinuxC技术 jackxiang 2014-10-10 18:07
CentOS 项目正式发布 CentOS 7.0-1406。相当于是 CentOS 7 的正式版。该版本使用存放于 git.centos.org 上的源码进行构建。所有的源码 rpms 采用相同的密钥进行签名,包括二进制文件。
同时从该版本开始 CentOS 将采用新的版本号规则,其中 1406 表示为 2014年6月。通过使用月份作为版本号,我们可以衍生和补发更新媒体容器和云映像、定期更新同时仍然保持连接到基础发行版的版本。
官方的发行说明请看:http://wiki.centos.org/Manuals/ReleaseNotes/CentOS7
CentOS 7 的主要变化包括:
内核更新至 3.10.0
支持 Linux 容器
Open VMware Tools 及 3D 图像能即装即用
OpenJDK-7 作为缺省 JDK
这次直接从 6.5 升级至 7.0(上文已提及)
ext4 及 XFS 的 LVM 快照
转用 systemd、firewalld 及 GRUB2
XFS 作为缺省文件系统
内核空间内的 iSCSI 及 FCoE
支持 PTPv2
支持 40G 网卡
更信息的改进说明请看红帽企业 Linux 7 的发行说明。
CentOS 7 只提供 64 位版本,下载地址:http://mirror.centos.org/centos/7/isos/
国内镜像:http://mirrors.aliyun.com/centos/7.0.1406/
同时从该版本开始 CentOS 将采用新的版本号规则,其中 1406 表示为 2014年6月。通过使用月份作为版本号,我们可以衍生和补发更新媒体容器和云映像、定期更新同时仍然保持连接到基础发行版的版本。
官方的发行说明请看:http://wiki.centos.org/Manuals/ReleaseNotes/CentOS7
CentOS 7 的主要变化包括:
内核更新至 3.10.0
支持 Linux 容器
Open VMware Tools 及 3D 图像能即装即用
OpenJDK-7 作为缺省 JDK
这次直接从 6.5 升级至 7.0(上文已提及)
ext4 及 XFS 的 LVM 快照
转用 systemd、firewalld 及 GRUB2
XFS 作为缺省文件系统
内核空间内的 iSCSI 及 FCoE
支持 PTPv2
支持 40G 网卡
更信息的改进说明请看红帽企业 Linux 7 的发行说明。
CentOS 7 只提供 64 位版本,下载地址:http://mirror.centos.org/centos/7/isos/
国内镜像:http://mirrors.aliyun.com/centos/7.0.1406/
加什么参数可以让tar把软链接所指向的真实数据也打到tar包中
Unix/LinuxC技术 jackxiang 2014-10-10 14:51
背景:有时打包不想打包软链接,有时想要打上,这就是涉及到Linux下的tar命令了,找了下,有一个这样的参数,可使用。
-h, --dereference dump instead the files symlinks point to
-h, --dereference
don't dump symlinks; dump the files they point to
实践如下:
[root@test tmp]# tar --help|grep dereference
-h, --dereference dump instead the files symlinks point to.
1)只打软链接进来不打真实文件:
tar -zcvf testtar-h.tar.gz testtar
2)打真实文件进来:
tar -zcvfh testtar-h.tar.gz testtar
小技巧:
其实用scp也就自动把软链接给过滤掉了,根本不留下软链接。
摘自:http://bbs.chinaunix.net/thread-1447388-1-1.html
实践成功如下,注意h位置,否则报错:
参考自:http://t.zoukankan.com/TreeDream-p-10277075.html
-h, --dereference dump instead the files symlinks point to
-h, --dereference
don't dump symlinks; dump the files they point to
实践如下:
[root@test tmp]# tar --help|grep dereference
-h, --dereference dump instead the files symlinks point to.
1)只打软链接进来不打真实文件:
tar -zcvf testtar-h.tar.gz testtar
2)打真实文件进来:
tar -zcvfh testtar-h.tar.gz testtar
小技巧:
其实用scp也就自动把软链接给过滤掉了,根本不留下软链接。
摘自:http://bbs.chinaunix.net/thread-1447388-1-1.html
实践成功如下,注意h位置,否则报错:
参考自:http://t.zoukankan.com/TreeDream-p-10277075.html
MacBook下的watch安装方法brew install watch, Linux 自带的 watchdog 的简介,Linux 软件看门狗 watchdog。
Unix/LinuxC技术 jackxiang 2014-10-9 20:58
MacBook下的watch安装方法brew install watch:
brew install watch (mac os)
https://www.jianshu.com/p/d75e50e38bb9
背景:
root@119.10.6.23:/usr/local/php# ps aux|grep watchdog
root 6 0.0 0.0 0 0 ? S Aug28 4:50 [watchdog/0]
root 10 0.0 0.0 0 0 ? S Aug28 4:11 [watchdog/1]
root 14 0.0 0.0 0 0 ? S Aug28 3:58 [watchdog/2]
root 18 0.0 0.0 0 0 ? S Aug28 3:36 [watchdog/3]
附:
最简单的安装教程(CentOS)
yum install watchdog -y
modprobe softdog
chkconfig watchdog on
/etc/init.d/watchdog start
配置看门狗程序,开机自动运行
chkconfig watchdog on
启动看门狗
sudo /etc/init.d/watchdog start
——————————————————————————————————————
Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开 /dev/watchdog 设备(俗称“开门放狗”),就会导致在内核中启动一个1分钟的定时器(系统默认时间),此后,用户空间程序需要保证在1分钟之内向这个设备写入数据(俗称“定期喂狗”),每次写操作会导致重新设定定时器。如果用户空间程序在1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作(“狗咬人了”呵呵)。通过这种机制,我们可以保证系统核心进程大部分时间都处于运行状态,即使特定情形下进程崩溃,因无法正常定时“喂狗”,Linux系统在看门狗作用下重新启动(reboot),核心进程又运行起来了。多用于嵌入式系统。
打开 /dev/watchdog 设备(“开门放狗”):
每隔一段时间向 /dev/watchdog 设备写入数据(“定期喂狗”):
关闭 /dev/watchdog 设备,通常不需要这个步骤:
所需头文件:
转自:http://blog.csdn.net/liigo/article/details/9227205
摘自:http://bbs.linuxtone.org/thread-19567-1-1.html
摘自:http://wjjchen.blog.163.com/blog/static/1628722201342354415584/
brew install watch (mac os)
https://www.jianshu.com/p/d75e50e38bb9
背景:
root@119.10.6.23:/usr/local/php# ps aux|grep watchdog
root 6 0.0 0.0 0 0 ? S Aug28 4:50 [watchdog/0]
root 10 0.0 0.0 0 0 ? S Aug28 4:11 [watchdog/1]
root 14 0.0 0.0 0 0 ? S Aug28 3:58 [watchdog/2]
root 18 0.0 0.0 0 0 ? S Aug28 3:36 [watchdog/3]
附:
最简单的安装教程(CentOS)
yum install watchdog -y
modprobe softdog
chkconfig watchdog on
/etc/init.d/watchdog start
配置看门狗程序,开机自动运行
chkconfig watchdog on
启动看门狗
sudo /etc/init.d/watchdog start
——————————————————————————————————————
Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开 /dev/watchdog 设备(俗称“开门放狗”),就会导致在内核中启动一个1分钟的定时器(系统默认时间),此后,用户空间程序需要保证在1分钟之内向这个设备写入数据(俗称“定期喂狗”),每次写操作会导致重新设定定时器。如果用户空间程序在1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作(“狗咬人了”呵呵)。通过这种机制,我们可以保证系统核心进程大部分时间都处于运行状态,即使特定情形下进程崩溃,因无法正常定时“喂狗”,Linux系统在看门狗作用下重新启动(reboot),核心进程又运行起来了。多用于嵌入式系统。
打开 /dev/watchdog 设备(“开门放狗”):
每隔一段时间向 /dev/watchdog 设备写入数据(“定期喂狗”):
关闭 /dev/watchdog 设备,通常不需要这个步骤:
所需头文件:
转自:http://blog.csdn.net/liigo/article/details/9227205
摘自:http://bbs.linuxtone.org/thread-19567-1-1.html
摘自:http://wjjchen.blog.163.com/blog/static/1628722201342354415584/
背景:在用c获取root后,执行一个命令退出时,报exit logout TERM environment variable not set.
# to avoid the error: TERM environment variable not set.
#
TERM=linux
export TERM
clear
摘自:http://bbs.chinaunix.net/thread-2070668-1-1.html
# to avoid the error: TERM environment variable not set.
#
TERM=linux
export TERM
clear
摘自:http://bbs.chinaunix.net/thread-2070668-1-1.html
如何让环境变量能够通过sudo传递进去。
Unix/LinuxC技术 jackxiang 2014-10-9 13:29
【解决方案】
在/etc/sudoers中修改:
Defaults env_reset
为:
Defaults !env_reset
一)这样,任何环境变量都可以通过sudo传进去了。
二)那你就把变量写到那个脚本里面去好了,sudo肯定是不会带这个用户的变量过去的,因为两个用户不一样,除非你通过sudo的时候加export去携带。
三)su - -c "命令集"
不过我希望的是,能够不改我的脚本,通过修改系统配置的方式把环境变量传进去。
以前好像通过在/etc/sudoers中配置env_reset和env_keep的方式搞定过。。。
那你直接写到/etc/profile里面不就得了
搞定了!在/etc/sudoers中修改:
Defaults env_reset
为:
Defaults !env_reset
这样,任何环境变量都可以通过sudo传进去了。
来自:http://bbs.chinaunix.net/thread-1920936-1-1.html
在/etc/sudoers中修改:
Defaults env_reset
为:
Defaults !env_reset
一)这样,任何环境变量都可以通过sudo传进去了。
二)那你就把变量写到那个脚本里面去好了,sudo肯定是不会带这个用户的变量过去的,因为两个用户不一样,除非你通过sudo的时候加export去携带。
三)su - -c "命令集"
不过我希望的是,能够不改我的脚本,通过修改系统配置的方式把环境变量传进去。
以前好像通过在/etc/sudoers中配置env_reset和env_keep的方式搞定过。。。
那你直接写到/etc/profile里面不就得了
搞定了!在/etc/sudoers中修改:
Defaults env_reset
为:
Defaults !env_reset
这样,任何环境变量都可以通过sudo传进去了。
来自:http://bbs.chinaunix.net/thread-1920936-1-1.html
由于我国的宽带基础设施太差,很多人都还停留在拨号上网时代,比如我家。每次开机还得另外点一下宽带连接才能上网真是挺麻烦的,我妈的电脑水平也不高,设置一个开机自动拨号还是很有必要的。下面我写出4种Windows7开机启动自动拨号上网的方法,大家根据自己的情况来选择使用。
自动宽带拨号连接上网
Windows7要实现开机启动自动拨号上网功能,要按下面的说明先设置一下。进入 控制面板->网络->网络和共享中心->更改适配器设置->宽带连接->属性,按下图进行设置。
拖进启动菜单进行开机启动
来自:http://www.ipc.me/win7-auto-dial.html
自动宽带拨号连接上网
Windows7要实现开机启动自动拨号上网功能,要按下面的说明先设置一下。进入 控制面板->网络->网络和共享中心->更改适配器设置->宽带连接->属性,按下图进行设置。
拖进启动菜单进行开机启动
来自:http://www.ipc.me/win7-auto-dial.html
phpdbg 作为一个交互式集成的调试器SAPI,安装扩展到PHP5.6.0里。
Php/Js/Shell/Go jackxiang 2014-10-4 10:01
背景:以前调试PHP如CPU100%发生在哪儿,用GDB,现在PHP自己带了一个PHPGDB,方便调试。
root@119.10.6.23:/data/codesdev/phpServer# php test.php
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# ps aux|grep test.php
root 4071 1.3 1.5 350356 92040 pts/1 S+ 11:37 0:00 php test.php
cli方式执行php脚本,加入执行的进程号为4071。我们使用gdb命令来调试进程。
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# gdb -p 4071
(gdb) print (char *)executor_globals.active_op_array->filename
$1 = 0x2ad61b4c8c48 "/data/codesdev/phpServer/test.php"
(gdb) print (char *)executor_globals.active_op_array->function_name
$2 = 0x2ad61b4c8d50 "test1"
(gdb) print executor_globals->current_execute_data->opline->lineno
$3 = 4
(gdb) print executor_globals->current_execute_data->opline->lineno
$4 = 4
很显然,他正在执行第四行的sleep方法。
如果上面的方法你感觉麻烦,那你可以使用.gdbinit文件。这个文件在php源码的根目录下。使用方法如下:
题外话:
从php5.6开始,php中集成了一个phpdbg的工具。可以像gdb调试c语言程序一样,调试php程序。感兴趣的话,可以打开下面的连接看看。
https://wiki.php.net/rfc/phpdbg
http://phpdbg.com/docs
来自:http://www.searchtb.com/2014/04/当cpu飙升时,找出php中可能有问题的代码行.html
————————————————————————————————————————————————————————————
phpdbg 作为一个交互式集成的调试器SAPI:
http://phpdbg.com/
Download:
https://codeload.github.com/krakjoe/phpdbg/legacy.zip/v0.4.0
Unzip:
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0/ext/krakjoe-phpdbg-cee9645#
http://phpdbg.com/docs
Installation
To install phpdbg, you must compile the source against your PHP installation sources, and enable the SAPI with the configure command.
cd /usr/src/php-src/sapi
git clone https://github.com/krakjoe/phpdbg
cd ../
./buildconf --force
./config.nice
make -j8
make install-phpdbg
phpdbg Felipe Pena, Joe Watkins, Bob Weinand
Command Line Options
The following switches are implemented (just like cli SAPI):
-n ignore php ini
-c search for php ini in path
-z load zend extension
-d define php ini entry
The following switches change the default behaviour of phpdbg:
-v disables quietness
-s enabled stepping
-e sets execution context
-b boring - disables use of colour on the console
-I ignore .phpdbginit (default init file)
-i override .phpgdbinit location (implies -I)
-O set oplog output file
-q do not print banner on startup
-r jump straight to run
-E enable step through eval()
Note: passing -rr will cause phpdbg to quit after execution, rather than returning to the console
root@119.10.6.23:/data/codesdev/phpServer# php test.php
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# ps aux|grep test.php
root 4071 1.3 1.5 350356 92040 pts/1 S+ 11:37 0:00 php test.php
cli方式执行php脚本,加入执行的进程号为4071。我们使用gdb命令来调试进程。
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0# gdb -p 4071
(gdb) print (char *)executor_globals.active_op_array->filename
$1 = 0x2ad61b4c8c48 "/data/codesdev/phpServer/test.php"
(gdb) print (char *)executor_globals.active_op_array->function_name
$2 = 0x2ad61b4c8d50 "test1"
(gdb) print executor_globals->current_execute_data->opline->lineno
$3 = 4
(gdb) print executor_globals->current_execute_data->opline->lineno
$4 = 4
很显然,他正在执行第四行的sleep方法。
如果上面的方法你感觉麻烦,那你可以使用.gdbinit文件。这个文件在php源码的根目录下。使用方法如下:
题外话:
从php5.6开始,php中集成了一个phpdbg的工具。可以像gdb调试c语言程序一样,调试php程序。感兴趣的话,可以打开下面的连接看看。
https://wiki.php.net/rfc/phpdbg
http://phpdbg.com/docs
来自:http://www.searchtb.com/2014/04/当cpu飙升时,找出php中可能有问题的代码行.html
————————————————————————————————————————————————————————————
phpdbg 作为一个交互式集成的调试器SAPI:
http://phpdbg.com/
Download:
https://codeload.github.com/krakjoe/phpdbg/legacy.zip/v0.4.0
Unzip:
root@119.10.6.23:/data/software/lnmp1.1-full/php-5.6.0/ext/krakjoe-phpdbg-cee9645#
http://phpdbg.com/docs
Installation
To install phpdbg, you must compile the source against your PHP installation sources, and enable the SAPI with the configure command.
cd /usr/src/php-src/sapi
git clone https://github.com/krakjoe/phpdbg
cd ../
./buildconf --force
./config.nice
make -j8
make install-phpdbg
phpdbg Felipe Pena, Joe Watkins, Bob Weinand
Command Line Options
The following switches are implemented (just like cli SAPI):
-n ignore php ini
-c search for php ini in path
-z load zend extension
-d define php ini entry
The following switches change the default behaviour of phpdbg:
-v disables quietness
-s enabled stepping
-e sets execution context
-b boring - disables use of colour on the console
-I ignore .phpdbginit (default init file)
-i override .phpgdbinit location (implies -I)
-O set oplog output file
-q do not print banner on startup
-r jump straight to run
-E enable step through eval()
Note: passing -rr will cause phpdbg to quit after execution, rather than returning to the console
在mysql数据库的err文件中看到如下信息:
Plugin 'FEDERATED' is disabled
InnoDB: The InnoDB memory heap is disabled
解决方法:vi /etc/my.cnf
tmpdir = /tmp
innodb_use_sys_malloc =0
重启问题解决?
这个参数是不是新的过时了呢?
InnoDB: Warning: Setting innodb_use_sys_malloc to FALSE is DEPRECATED. This option may be removed in future releases, together with the InnoDB's internal memory allocator.
InnoDB:警告:设置innodb_use_sys_malloc假是过时的。此选项可能会在未来的版本中删除,连同InnoDB的内存分配器。
[Note] Plugin 'FEDERATED' is disabled.
这个不用理会的,没事。
__________________________________________
在网上找到解决方案:
1、在MY.INI文件中的 [mysqld] 中增加一行tmpdir="D:/MySQL/data/"修改后,还是启动不了或者能启动但关机后又出现同样问题,接着我做了第二步,重启正常。
2、删除DATA目录下除数据库文件夹外的其他文件,重启mysql,问题解决.
上面办法我按做了但是不行,自己摸索出一个解决办法与上面差不多
第一步:只要删除MySQL目录下的ib_logfile0和ib_logfile1两个文件.
第二步:找出了无法启动的原因,MySQL在安装的时候不会自动初始tmpdir,临时文件目录,所以要在配置文件my.ini中添加tmpdir路径.
最后在my.ini中添加:
[mysqld]
#自己指定的临时文件目录
tmpdir="E:/Program Files/MySQL/MySQL Server 5.1/Temp/" //phpfensi.com
来自:http://www.phpfensi.com/mysql/20140927/6253.html
[root@jackxiang mysql]# ls ib_logfile
ib_logfile0 ib_logfile1 ib_logfile2
Plugin 'FEDERATED' is disabled
InnoDB: The InnoDB memory heap is disabled
解决方法:vi /etc/my.cnf
tmpdir = /tmp
innodb_use_sys_malloc =0
重启问题解决?
这个参数是不是新的过时了呢?
InnoDB: Warning: Setting innodb_use_sys_malloc to FALSE is DEPRECATED. This option may be removed in future releases, together with the InnoDB's internal memory allocator.
InnoDB:警告:设置innodb_use_sys_malloc假是过时的。此选项可能会在未来的版本中删除,连同InnoDB的内存分配器。
[Note] Plugin 'FEDERATED' is disabled.
这个不用理会的,没事。
__________________________________________
在网上找到解决方案:
1、在MY.INI文件中的 [mysqld] 中增加一行tmpdir="D:/MySQL/data/"修改后,还是启动不了或者能启动但关机后又出现同样问题,接着我做了第二步,重启正常。
2、删除DATA目录下除数据库文件夹外的其他文件,重启mysql,问题解决.
上面办法我按做了但是不行,自己摸索出一个解决办法与上面差不多
第一步:只要删除MySQL目录下的ib_logfile0和ib_logfile1两个文件.
第二步:找出了无法启动的原因,MySQL在安装的时候不会自动初始tmpdir,临时文件目录,所以要在配置文件my.ini中添加tmpdir路径.
最后在my.ini中添加:
[mysqld]
#自己指定的临时文件目录
tmpdir="E:/Program Files/MySQL/MySQL Server 5.1/Temp/" //phpfensi.com
来自:http://www.phpfensi.com/mysql/20140927/6253.html
[root@jackxiang mysql]# ls ib_logfile
ib_logfile0 ib_logfile1 ib_logfile2
查看mysql启动日志:
2014-10-01 11:08:45 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
这是数据库升级过程中,timestamp在5.6以前的数据库中默认not null,如果没有显示声明timestamp的默认值,那么该列用全0的”0000-00-00 00:00:00″作为默认值
加上还是会报这个问题,听说有一个坑,于是查了一下,这个Url有点用:http://cuelog.com/archives/4.html
如果初始化时出现
1 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
在mysql的安装根目录下生成的my.cnf中加入:
2 explicit_defaults_for_timestamp = true
还是报错,按mysql提示的执行下面的mysql启动命令:
按mysql的说明,接下来是执行:
3 ./bin/mysqld_safe --user=mysql --explicit_defaults_for_timestamp=1 &
——————————————————————————————————————————————
来自:
http://www.kankanews.com/ICkengine/archives/110105.shtml
http://www.williamsang.com/archives/818.html
2014-10-01 11:08:45 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
这是数据库升级过程中,timestamp在5.6以前的数据库中默认not null,如果没有显示声明timestamp的默认值,那么该列用全0的”0000-00-00 00:00:00″作为默认值
加上还是会报这个问题,听说有一个坑,于是查了一下,这个Url有点用:http://cuelog.com/archives/4.html
如果初始化时出现
1 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
在mysql的安装根目录下生成的my.cnf中加入:
2 explicit_defaults_for_timestamp = true
还是报错,按mysql提示的执行下面的mysql启动命令:
按mysql的说明,接下来是执行:
3 ./bin/mysqld_safe --user=mysql --explicit_defaults_for_timestamp=1 &
——————————————————————————————————————————————
来自:
http://www.kankanews.com/ICkengine/archives/110105.shtml
http://www.williamsang.com/archives/818.html
背景:skip-name-resolve 参数的目的是不再进行反解析(ip不反解成域名),这样可以加快数据库的反应时间。修改配置文件添加并需要重启:[mysqld] skip-name-resolve添加后发现错误日志有警告信息:
[root@jackxiang mysql]# vi my.cnf
skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
实践如下:
重启mysql,发现日志还有:
1)按提示作下查询,果然有一个空账户和root帐户的Host是jackxiang:
select * from user where Host="jackxiang"\G;
mysql> select Host,User,Password from user where Host="jackxiang";
+-----------+------+-----------------------------------------------------+
| Host | User | Password |
+-----------+------+-----------------------------------------------------+
| jackxiang | | |
| jackxiang |root | *2CD42BDFDF0EB0E*Z****3458EB72EE1F17F26F |
+-----------+------+------------------------------------------------------+
2)查下localhost,因为大都是限定本机连接,不让外面机器连接,确保安全:
mysql> select Host,User,Password from user where Host="localhost" limit 2;
+-----------+-----------------+-------------------------------------------+
| Host | User | Password |
+-----------+-----------------+-------------------------------------------+
| localhost | | |
| localhost | jack_mysql | *2CD42BDFDF0E***3458EB72EE1F17F26F |
+-----------+-----------------+-------------------------------------------+
3)把Host既是 jackxiang的,用户是空或root的Host修改为localhost:
mysql> update user set Host="localhost" where Host="jackxiang";
ERROR 1062 (23000): Duplicate entry 'localhost-' for key 'PRIMARY'
这样搞不行,得一个一个干掉,看有没有root同名的,查下:
mysql> select Host,User,Password from user where User="";
+-----------+------+----------+
| Host | User | Password |
+-----------+------+----------+
| localhost | | |
| jackxiang | | |
+-----------+------+----------+
mysql> delete from user where User="" and Password="";
Query OK, 2 rows affected (0.01 sec)
4)查下user为root的
mysql> select Host,User,Password from user where User="root";
+-----------+------+-------------------------------------------+
| Host | User | Password |
+-----------+------+-------------------------------------------+
| localhost | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| jackxiang | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| 127.0.0.1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| ::1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
+-----------+------+-------------------------------------------+
5)留下localhost就足够了,其余删除掉:
mysql> delete from user where Host !="localhost" and User="root";
Query OK, 3 rows affected (0.00 sec)
6)restart mysql:
日志warning还有一个:
[Warning] 'proxies_priv' entry '@ root@jackxiang' ignored in --skip-name-resolve mode.
解决办法:
然后删除表mysql.proxies_priv中和cvs类似与具体域名有关的行,方法同上。
mysql> select Host,User,Proxied_host,Proxied_user,With_grant,Grantor,Timestamp from proxies_priv ;
+-----------+------+--------------+--------------+------------+---------+----------------+
| Host | User | Proxied_host | Proxied_user | With_grant | Grantor | Timestamp |
+-----------+------+--------------+--------------+------------+---------+----------------+
| localhost | root | | | 1 | | 2014-07-14 13:26:08 |
| jackxiang | root | | | 1 | | 2014-07-14 13:26:08 |
+-----------+------+--------------+--------------+------------+---------+----------------+
mysql> delete from proxies_priv where Host="jackxiang";
Query OK, 1 row affected (0.02 sec)
这下彻底清静了。
原来是当时安装mysql后,多次grant授权引起的,。
备注:
skip-name-resolve是禁用dns解析,避免网络DNS解析服务引发访问MYSQL的错误,一般应当启用。 启用后,在mysql的授权表中就不能使用主机名了,只能使用IP ,出现此警告是由于mysql 表中已经存在有 root@jackxiang 帐号信息。 我们把它删除就好了。 mysql>use mysql; mysql> delete from user where HOST='localhost.localdomain'; Query OK, 2 rows affected (0.00 sec) 重启MYSQL ,发现警告已经没有啦。
来自:http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7084.html
http://blog.itpub.net/14184018/viewspace-1061224/
[root@jackxiang mysql]# vi my.cnf
skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
实践如下:
重启mysql,发现日志还有:
1)按提示作下查询,果然有一个空账户和root帐户的Host是jackxiang:
select * from user where Host="jackxiang"\G;
mysql> select Host,User,Password from user where Host="jackxiang";
+-----------+------+-----------------------------------------------------+
| Host | User | Password |
+-----------+------+-----------------------------------------------------+
| jackxiang | | |
| jackxiang |root | *2CD42BDFDF0EB0E*Z****3458EB72EE1F17F26F |
+-----------+------+------------------------------------------------------+
2)查下localhost,因为大都是限定本机连接,不让外面机器连接,确保安全:
mysql> select Host,User,Password from user where Host="localhost" limit 2;
+-----------+-----------------+-------------------------------------------+
| Host | User | Password |
+-----------+-----------------+-------------------------------------------+
| localhost | | |
| localhost | jack_mysql | *2CD42BDFDF0E***3458EB72EE1F17F26F |
+-----------+-----------------+-------------------------------------------+
3)把Host既是 jackxiang的,用户是空或root的Host修改为localhost:
mysql> update user set Host="localhost" where Host="jackxiang";
ERROR 1062 (23000): Duplicate entry 'localhost-' for key 'PRIMARY'
这样搞不行,得一个一个干掉,看有没有root同名的,查下:
mysql> select Host,User,Password from user where User="";
+-----------+------+----------+
| Host | User | Password |
+-----------+------+----------+
| localhost | | |
| jackxiang | | |
+-----------+------+----------+
mysql> delete from user where User="" and Password="";
Query OK, 2 rows affected (0.01 sec)
4)查下user为root的
mysql> select Host,User,Password from user where User="root";
+-----------+------+-------------------------------------------+
| Host | User | Password |
+-----------+------+-------------------------------------------+
| localhost | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| jackxiang | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| 127.0.0.1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
| ::1 | root | *2CD42BDFDF0EB0E1A7777777777EE1F17F26F |
+-----------+------+-------------------------------------------+
5)留下localhost就足够了,其余删除掉:
mysql> delete from user where Host !="localhost" and User="root";
Query OK, 3 rows affected (0.00 sec)
6)restart mysql:
日志warning还有一个:
[Warning] 'proxies_priv' entry '@ root@jackxiang' ignored in --skip-name-resolve mode.
解决办法:
然后删除表mysql.proxies_priv中和cvs类似与具体域名有关的行,方法同上。
mysql> select Host,User,Proxied_host,Proxied_user,With_grant,Grantor,Timestamp from proxies_priv ;
+-----------+------+--------------+--------------+------------+---------+----------------+
| Host | User | Proxied_host | Proxied_user | With_grant | Grantor | Timestamp |
+-----------+------+--------------+--------------+------------+---------+----------------+
| localhost | root | | | 1 | | 2014-07-14 13:26:08 |
| jackxiang | root | | | 1 | | 2014-07-14 13:26:08 |
+-----------+------+--------------+--------------+------------+---------+----------------+
mysql> delete from proxies_priv where Host="jackxiang";
Query OK, 1 row affected (0.02 sec)
这下彻底清静了。
原来是当时安装mysql后,多次grant授权引起的,。
备注:
skip-name-resolve是禁用dns解析,避免网络DNS解析服务引发访问MYSQL的错误,一般应当启用。 启用后,在mysql的授权表中就不能使用主机名了,只能使用IP ,出现此警告是由于mysql 表中已经存在有 root@jackxiang 帐号信息。 我们把它删除就好了。 mysql>use mysql; mysql> delete from user where HOST='localhost.localdomain'; Query OK, 2 rows affected (0.00 sec) 重启MYSQL ,发现警告已经没有啦。
来自:http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7084.html
http://blog.itpub.net/14184018/viewspace-1061224/
php-fpm 配置不当 导致 nginx 502 错误一例
Php/Js/Shell/Go jackxiang 2014-10-1 00:07
背景:开php-fpm的9000端口,有时配置出错会出现502,特别转载。
不要总看nginx 的日志文件。
对于开端口这种事情,listen.allowed_clients 里逗号分割不能有空格!
[www]
listen = 10.11.80.49:9000
listen.allowed_clients = 10.11.80.47,10.11.80.48, 10.11.80.49
阅读全文
不要总看nginx 的日志文件。
对于开端口这种事情,listen.allowed_clients 里逗号分割不能有空格!
[www]
listen = 10.11.80.49:9000
listen.allowed_clients = 10.11.80.47,10.11.80.48, 10.11.80.49
阅读全文
背景:有可能 fastcgi Connection reset by peer于502共同发生,(参看:https://jackxiang.com/post/4710/ ,http://www.jb51.net/article/50408.htm 写道:很多站长转到nginx+php-fpm后,饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。php-fpm.conf的配置文件中有一个参数request_slowlog_timeout。 )。注意nginx的notice日志及php的request_slowlog_timeout日志。
1)nginx:
在nginx的全局配置中增加 : error_log logs/error.log notice;
nginx记录日志信息分两个级别,第一个级别的取值为如下之一:
“stderr”, “emerg”, “alert”, “crit”, “error”,”warn”, “notice”, “info”, “debug”
这些值是互斥的,也就是说只能取其中之一,如果在配置文件里加了像如下这种两条配置项:
error_log logs/error.log notice;
error_log logs/error.log info;
2)php的php-fpm.conf增加时间长度限定超过就算超时:
当PHP运行在php-fpm模式下,php.ini配置的max_execute_time是无效的,需要在php-fpm.conf中配置另外一个配置项:request_terminate_timeout;
request_terminate_timeout = 10
request_slowlog_timeout = 0
slowlog = /data/logs/php/slow.log
当request_slowlog_timeout 设为一个具体秒时request_slowlog_timeout =5,表示如果哪个脚本执行时间大于5秒,会记录这个脚本到慢日志文件中
request_slowlog_timeout =0表示关闭慢日志输出。
摘自:http://blog.csdn.net/zhangxinrun/article/details/17002939
下面是php 5.3以上版本将TCP改成socket方式的配置方法:
修改php-fpm.conf(/usr/local/php/etc/php-fpm.conf)
;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock
nginx通过unix socket和fastcgi通信,比tcp socket要高效,重负荷下可以考虑。
1、在nginx.conf中修改配置为:
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
2、在php-fpm.conf中修改配置为:
/tmp/php-cgi.sock
同理,在proxy_pass、upstream server 等处都能使用
言归正传:
Connection reset by peer
这个错误是在nginx的错误日志中发现的,为了更全面的掌握nginx运行的异常,强烈建议在nginx的全局配置中增加
error_log logs/error.log notice;
这样,就可以记录nginx的详细异常信息。
nginx的错误日志中会出现Connection reset by peer) while reading response header from upstream, client: 1.1.1.1, server: 102.local, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000
后来反复检查,发现这是因为php运行较慢,并超出php-fpm.conf的request_terminate_timeout设置的秒数。
request_terminate_timeout用于设置当某个php脚本运行最长时间,若超出php-fpm进程管理器强行中止当前程序,并关闭fastcgi和nginx的网络连接,然后nginx中就会出现Connection reset by peer的错误了。
也就是说,产生这个错误的原因是:
php 程序的运行时间超出request_terminate_timeout设置的值。
在php-fpm环境下,在php的安装目录的etc/php-fpm.conf中有此值的设置项,可将其设置为0或更大的值。
提示,在php.ini中存在一项max_execution_time,也用于设置php脚本的最长执行时间。但在php-fpm环境下,我发现max_execution_time的设置是无效的,只有request_terminate_timeout产生了作用。
总结:请将request_terminate_timeout设置为较大的值或0,可减少因php脚本执行时行过长导致nginx产生Connection reset by peer错误。
转自:http://zhangxugg-163-com.iteye.com/blog/1310311
1)nginx:
在nginx的全局配置中增加 : error_log logs/error.log notice;
nginx记录日志信息分两个级别,第一个级别的取值为如下之一:
“stderr”, “emerg”, “alert”, “crit”, “error”,”warn”, “notice”, “info”, “debug”
这些值是互斥的,也就是说只能取其中之一,如果在配置文件里加了像如下这种两条配置项:
error_log logs/error.log notice;
error_log logs/error.log info;
2)php的php-fpm.conf增加时间长度限定超过就算超时:
当PHP运行在php-fpm模式下,php.ini配置的max_execute_time是无效的,需要在php-fpm.conf中配置另外一个配置项:request_terminate_timeout;
request_terminate_timeout = 10
request_slowlog_timeout = 0
slowlog = /data/logs/php/slow.log
当request_slowlog_timeout 设为一个具体秒时request_slowlog_timeout =5,表示如果哪个脚本执行时间大于5秒,会记录这个脚本到慢日志文件中
request_slowlog_timeout =0表示关闭慢日志输出。
摘自:http://blog.csdn.net/zhangxinrun/article/details/17002939
下面是php 5.3以上版本将TCP改成socket方式的配置方法:
修改php-fpm.conf(/usr/local/php/etc/php-fpm.conf)
;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock
nginx通过unix socket和fastcgi通信,比tcp socket要高效,重负荷下可以考虑。
1、在nginx.conf中修改配置为:
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
2、在php-fpm.conf中修改配置为:
/tmp/php-cgi.sock
同理,在proxy_pass、upstream server 等处都能使用
言归正传:
Connection reset by peer
这个错误是在nginx的错误日志中发现的,为了更全面的掌握nginx运行的异常,强烈建议在nginx的全局配置中增加
error_log logs/error.log notice;
这样,就可以记录nginx的详细异常信息。
nginx的错误日志中会出现Connection reset by peer) while reading response header from upstream, client: 1.1.1.1, server: 102.local, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000
后来反复检查,发现这是因为php运行较慢,并超出php-fpm.conf的request_terminate_timeout设置的秒数。
request_terminate_timeout用于设置当某个php脚本运行最长时间,若超出php-fpm进程管理器强行中止当前程序,并关闭fastcgi和nginx的网络连接,然后nginx中就会出现Connection reset by peer的错误了。
也就是说,产生这个错误的原因是:
php 程序的运行时间超出request_terminate_timeout设置的值。
在php-fpm环境下,在php的安装目录的etc/php-fpm.conf中有此值的设置项,可将其设置为0或更大的值。
提示,在php.ini中存在一项max_execution_time,也用于设置php脚本的最长执行时间。但在php-fpm环境下,我发现max_execution_time的设置是无效的,只有request_terminate_timeout产生了作用。
总结:请将request_terminate_timeout设置为较大的值或0,可减少因php脚本执行时行过长导致nginx产生Connection reset by peer错误。
转自:http://zhangxugg-163-com.iteye.com/blog/1310311
:w !sudo tee %
/Users/jackXiang/.oh-my-zsh/.alias
alias vimsudow="echo -e \":w !sudo tee %\" && echo -e \"w !sudo tee %\" | pbcopy"
背景:经常碰到文件修改后才发现没有权限,而事先又没有使用sudo来编辑,有没办法实现保存此次修改不退出再sudo,也不存放临文件?
如:
root用户:
vi /tmp/tee.txt 写上123,保存退出后,再:
chmod -R 755 /tmp/tee.txt
我再su xiangdong,打开这个文件,然后修改下,想保存,就会提示:E45: 'readonly' option is set (add ! to override)
你听vi提示后,真整个: w! ,于是又提示你:
"tee.txt" E212: Can't open file for writing
Press ENTER or type command to continue
是不是很搞笑???下面扯了老半天,其说的就是这个问题。
root建立文件,属于root的,它再755后是一个什么状态分析起:
u g o :用户,组,其它!
R w X :读 ,写,执行!
4 2 1 : 4 , 2 , 1 !
755,也就是说,root是啥都能干,组和其他只能是4+1,及是:读+执行,写2没有这个权限值。你是xiangdong,想修改当然不让修改了。
网上说是这样能摆平,如下:
:w !sudo tee %
[sudo] password for xiangdong:
输入密码这儿
121
jack
Press ENTER or type command to continue
于是按提示按下enter回车出现下面提示:
W12: Warning: File "tee.txt" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
于是再按提示按L键出现(此时已经保存进去了。):
121
jack
"tee.txt" [readonly] 3L, 10C
xiangodng用户退出该vim后,再打开,确实保存成功了。
输入密码折腾一下验证确实是保存了的,经实践确实是可以的,下面就开始整这个是怎么实现的,我对此不太感兴趣,仅仅摘录如下:
——————————————————————————————————————————————————————————
在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误:
E45: 'readonly' option is set (add ! to override)
这表明文件是只读的,按照提示,加上!强制保存::w!,结果又一个错误出现:
"readonly-file-name" E212: Can't open file for writing
文件明明存在,为何提示无法打开?这错误又代表什么呢?查看文档:help E212:
For some reason the file you are writing to cannot be created or overwritten. The reason could be that you do not have permission to write in the directory or the file name is not valid.
原来是可能没有权限造成的。此时你才想起,这个文件需要root权限才能编辑,而当前登陆的只是普通用户,在编辑之前你忘了使用sudo来启动Vim,所以才保存失败。于是为了防止修改丢失,你只好先把它保存为另外一个临时文件temp-file-name,然后退出Vim,再运行sudo mv temp-file-name readonly-file-name覆盖原文件。
用vi修改文件,保存文件时,提示“readonly option is set”的解决方法:
This is a vim issue, not a file permission issue. If you did not have read permission on the file, you'd see a "Permission denied" error.
Do you invoke vi/vim with the -R option? Are you calling view instead of vi or vim? Do you have set readonly in your .vimrc or in a file in ~/.vim/ftplugin?
In vim you can enter :set noreadonly to unset the readonly flag.
步骤:
1.按Esc键
2.输入 :set noreadonly
3.然后就能正常保存了,你可以输入 :wq 来保存文件了。
来自:http://blog.csdn.net/longerandlonger/article/details/7266055
=============================================================================
目录
解决方案
Vim中执行外部命令
命令的另一种表示形式
%的意义
tee的作用
命令执行之后
更简单的方案:映射
另一种思路
重定向的问题
重定向方案
写在结尾
但这样操作过于繁琐。而且如果只是想暂存此文件,还需要接着修改,则希望保留Vim的工作状态,比如编辑历史,buffer状态等等,该怎么办?能不能在不退出Vim的情况下获得root权限来保存这个文件?
解决方案
答案是可以,执行这样一条命令即可:
:w !sudo tee %
接下来我们来分析这个命令为什么可以工作。首先查看文档:help :w,向下滚动一点可以看到:
把这个使用方法对应前面的命令,如下所示:
我们并未指定range,参见帮助文档最下面一行,当range未指定时,默认情况下是整个文件。此外,这里也没有指定opt。
Vim中执行外部命令
接下来是一个叹号!,它表示其后面部分是外部命令,即sudo tee %。文档中说的很清楚,这和直接执行:!{cmd}是一样的效果。后者的作用是打开shell执行一个命令,比如,运行:!ls,会显示当前工作目录下的所有文件,这非常有用,任何可以在shell中执行的命令都可以在不退出Vim的情况下运行,并且可以将结果读入到Vim中来。试想,如果你要在Vim中插入当前工作路径或者当前工作路径下的所有文件名,你可以运行:
:r !pwd或:r !ls
此时所有的内容便被读入至Vim,而不需要退出Vim,执行命令,然后拷贝粘贴至Vim中。有了它,Vim可以自由的操作shell而无需退出。
命令的另一种表示形式
再看前面的文档:
Execute {cmd} with [range] lines as standard input
所以实际上这个:w并未真的保存当前文件,就像执行:w new-file-name时,它将当前文件的内容保存到另外一个new-file-name的文件中,在这里它相当于一个另存为,而不是保存。它将当前文档的内容写到后面cmd的标准输入中,再来执行cmd,所以整个命令可以转换为一个具有相同功能的普通shell命令:
$ cat readonly-file-name | sudo tee %
这样看起来”正常”些了。其中sudo很好理解,意为切换至root执行后面的命令,tee和%是什么呢?
%的意义
我们先来看%,执行:help cmdline-special可以看到:
在执行外部命令时,%会扩展成当前文件名,所以上述的cmd也就成了sudo tee readonly-file-name。此时整个命令即:
$ cat readonly-file-name | sudo tee readonly-file-name
注意:在另外一个地方我们也经常用到%,没错,替换。但是那里%的作用不一样,执行:help :%查看文档:
在替换中,%的意义是代表整个文件,而不是文件名。所以对于命令:%s/old/new/g,它表示的是替换整篇文档中的old为new,而不是把文件名中的old换成new。
tee的作用
现在只剩一个难点: tee。它究竟有何用?维基百科上对其有一个详细的解释,你也可以查看man page。下面这幅图很形象的展示了tee是如何工作的:
ls -l的输出经过管道传给了tee,后者做了两件事,首先拷贝一份数据到文件file.txt,同时再拷贝一份到其标准输出。数据再次经过管道传给less的标准输入,所以它在不影响原有管道的基础上对数据作了一份拷贝并保存到文件中。看上图中间部分,它很像大写的字母T,给数据流动增加了一个分支,tee的名字也由此而来。
现在上面的命令就容易理解了,tee将其标准输入中的内容写到了readonly-file-name中,从而达到了更新只读文件的目的。当然这里其实还有另外一半数据:tee的标准输出,但因为后面没有跟其它的命令,所以这份输出相当于被抛弃。当然也可以在后面补上> /dev/null,以显式的丢弃标准输出,但是这对整个操作没有影响,而且会增加输入的字符数,因此只需上述命令即可。
命令执行之后
运行完上述命令后,会出现下面的提示:
Vim提示文件更新,询问是确认还是重新加载文件。建议直接输入O,因为这样可以保留Vim的工作状态,比如编辑历史,buffer等,撤消等操作仍然可以继续。而如果选择L,文件会以全新的文件打开,所有的工作状态便丢失了,此时无法执行撤消,buffer中的内容也被清空。
更简单的方案:映射
上述方式非常完美的解决了文章开始提出的问题,但毕竟命令还是有些长,为了避免每次输入一长串的命令,可以将它映射为一个简单的命令加到.vimrc中:
这样,简单的运行:w!!即可。命令后半部分> /dev/null在前面已经解释过,作用为显式的丢掉标准输出的内容。
另一种思路
至此,一个比较完美但很tricky的方案已经完成。你可能会问,为什么不用下面这样更常见的命令呢?这不是更容易理解,更简单一些么?
:w !sudo cat > %
重定向的问题
我们来分析一遍,像前面一样,它可以被转换为相同功能的shell命令:
$ cat readonly-file-name | sudo cat > %
这条命令看起来一点问题没有,可一旦运行,又会出现另外一个错误:
/bin/sh: readonly-file-name: Permission denied shell returned 1
这是怎么回事?不是明明加了sudo么,为什么还提示说没有权限?稍安勿躁,原因在于重定向,它是由shell执行的,在一切命令开始之前,shell便会执行重定向操作,所以重定向并未受sudo影响,而当前的shell本身也是以普通用户身份启动,也没有权限写此文件,因此便有了上面的错误。
重定向方案
这里介绍了几种解决重定向无权限错误的方法,当然除了tee方案以外,还有一种比较方便的方案:以sudo打开一个shell,然后在该具有root权限的shell中执行含重定向的命令,如:
:w !sudo sh -c 'cat > %'
可是这样执行时,由于单引号的存在,所以在Vim中%并不会展开,它被原封不动的传给了shell,而在shell中,一个单独的%相当于nil,所以文件被重定向到了nil,所有内容丢失,保存文件失败。
既然是由于%没有展开导致的错误,那么试着将单引号'换成双引号"再试一次:
:w !sudo sh -c "cat > %"
成功!这是因为在将命令传到shell去之前,%已经被扩展为当前的文件名。有关单引号和双引号的区别可以参考这里,简单的说就是单引号会将其内部的内容原封不动的传给命令,但是双引号会展开一些内容,比如变量,转义字符等。
当然,也可以像前面一样将它映射为一个简单的命令并添加到.vimrc中:
注意:这里不再需要把输出重定向到/dev/null中。
写在结尾
至此,借助Vim强大的灵活性,实现了两种方案,可以在以普通用户启动的Vim中保存需root权限的文件。两者的原理类似,都是利用了Vim可以执行外部命令这一特性,区别在于使用不同的shell命令。如果你还有其它的方案,欢迎给我留言。
来自:
http://www.kuqin.com/shuoit/20140731/341487.html
http://blog.csdn.net/xinhaozheng/article/details/5756838
http://segmentfault.com/q/1010000000130006
/Users/jackXiang/.oh-my-zsh/.alias
alias vimsudow="echo -e \":w !sudo tee %\" && echo -e \"w !sudo tee %\" | pbcopy"
背景:经常碰到文件修改后才发现没有权限,而事先又没有使用sudo来编辑,有没办法实现保存此次修改不退出再sudo,也不存放临文件?
如:
root用户:
vi /tmp/tee.txt 写上123,保存退出后,再:
chmod -R 755 /tmp/tee.txt
我再su xiangdong,打开这个文件,然后修改下,想保存,就会提示:E45: 'readonly' option is set (add ! to override)
你听vi提示后,真整个: w! ,于是又提示你:
"tee.txt" E212: Can't open file for writing
Press ENTER or type command to continue
是不是很搞笑???下面扯了老半天,其说的就是这个问题。
root建立文件,属于root的,它再755后是一个什么状态分析起:
u g o :用户,组,其它!
R w X :读 ,写,执行!
4 2 1 : 4 , 2 , 1 !
755,也就是说,root是啥都能干,组和其他只能是4+1,及是:读+执行,写2没有这个权限值。你是xiangdong,想修改当然不让修改了。
网上说是这样能摆平,如下:
:w !sudo tee %
[sudo] password for xiangdong:
输入密码这儿
121
jack
Press ENTER or type command to continue
于是按提示按下enter回车出现下面提示:
W12: Warning: File "tee.txt" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
于是再按提示按L键出现(此时已经保存进去了。):
121
jack
"tee.txt" [readonly] 3L, 10C
xiangodng用户退出该vim后,再打开,确实保存成功了。
输入密码折腾一下验证确实是保存了的,经实践确实是可以的,下面就开始整这个是怎么实现的,我对此不太感兴趣,仅仅摘录如下:
——————————————————————————————————————————————————————————
在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误:
E45: 'readonly' option is set (add ! to override)
这表明文件是只读的,按照提示,加上!强制保存::w!,结果又一个错误出现:
"readonly-file-name" E212: Can't open file for writing
文件明明存在,为何提示无法打开?这错误又代表什么呢?查看文档:help E212:
For some reason the file you are writing to cannot be created or overwritten. The reason could be that you do not have permission to write in the directory or the file name is not valid.
原来是可能没有权限造成的。此时你才想起,这个文件需要root权限才能编辑,而当前登陆的只是普通用户,在编辑之前你忘了使用sudo来启动Vim,所以才保存失败。于是为了防止修改丢失,你只好先把它保存为另外一个临时文件temp-file-name,然后退出Vim,再运行sudo mv temp-file-name readonly-file-name覆盖原文件。
用vi修改文件,保存文件时,提示“readonly option is set”的解决方法:
This is a vim issue, not a file permission issue. If you did not have read permission on the file, you'd see a "Permission denied" error.
Do you invoke vi/vim with the -R option? Are you calling view instead of vi or vim? Do you have set readonly in your .vimrc or in a file in ~/.vim/ftplugin?
In vim you can enter :set noreadonly to unset the readonly flag.
步骤:
1.按Esc键
2.输入 :set noreadonly
3.然后就能正常保存了,你可以输入 :wq 来保存文件了。
来自:http://blog.csdn.net/longerandlonger/article/details/7266055
=============================================================================
目录
解决方案
Vim中执行外部命令
命令的另一种表示形式
%的意义
tee的作用
命令执行之后
更简单的方案:映射
另一种思路
重定向的问题
重定向方案
写在结尾
但这样操作过于繁琐。而且如果只是想暂存此文件,还需要接着修改,则希望保留Vim的工作状态,比如编辑历史,buffer状态等等,该怎么办?能不能在不退出Vim的情况下获得root权限来保存这个文件?
解决方案
答案是可以,执行这样一条命令即可:
:w !sudo tee %
接下来我们来分析这个命令为什么可以工作。首先查看文档:help :w,向下滚动一点可以看到:
把这个使用方法对应前面的命令,如下所示:
我们并未指定range,参见帮助文档最下面一行,当range未指定时,默认情况下是整个文件。此外,这里也没有指定opt。
Vim中执行外部命令
接下来是一个叹号!,它表示其后面部分是外部命令,即sudo tee %。文档中说的很清楚,这和直接执行:!{cmd}是一样的效果。后者的作用是打开shell执行一个命令,比如,运行:!ls,会显示当前工作目录下的所有文件,这非常有用,任何可以在shell中执行的命令都可以在不退出Vim的情况下运行,并且可以将结果读入到Vim中来。试想,如果你要在Vim中插入当前工作路径或者当前工作路径下的所有文件名,你可以运行:
:r !pwd或:r !ls
此时所有的内容便被读入至Vim,而不需要退出Vim,执行命令,然后拷贝粘贴至Vim中。有了它,Vim可以自由的操作shell而无需退出。
命令的另一种表示形式
再看前面的文档:
Execute {cmd} with [range] lines as standard input
所以实际上这个:w并未真的保存当前文件,就像执行:w new-file-name时,它将当前文件的内容保存到另外一个new-file-name的文件中,在这里它相当于一个另存为,而不是保存。它将当前文档的内容写到后面cmd的标准输入中,再来执行cmd,所以整个命令可以转换为一个具有相同功能的普通shell命令:
$ cat readonly-file-name | sudo tee %
这样看起来”正常”些了。其中sudo很好理解,意为切换至root执行后面的命令,tee和%是什么呢?
%的意义
我们先来看%,执行:help cmdline-special可以看到:
在执行外部命令时,%会扩展成当前文件名,所以上述的cmd也就成了sudo tee readonly-file-name。此时整个命令即:
$ cat readonly-file-name | sudo tee readonly-file-name
注意:在另外一个地方我们也经常用到%,没错,替换。但是那里%的作用不一样,执行:help :%查看文档:
在替换中,%的意义是代表整个文件,而不是文件名。所以对于命令:%s/old/new/g,它表示的是替换整篇文档中的old为new,而不是把文件名中的old换成new。
tee的作用
现在只剩一个难点: tee。它究竟有何用?维基百科上对其有一个详细的解释,你也可以查看man page。下面这幅图很形象的展示了tee是如何工作的:
ls -l的输出经过管道传给了tee,后者做了两件事,首先拷贝一份数据到文件file.txt,同时再拷贝一份到其标准输出。数据再次经过管道传给less的标准输入,所以它在不影响原有管道的基础上对数据作了一份拷贝并保存到文件中。看上图中间部分,它很像大写的字母T,给数据流动增加了一个分支,tee的名字也由此而来。
现在上面的命令就容易理解了,tee将其标准输入中的内容写到了readonly-file-name中,从而达到了更新只读文件的目的。当然这里其实还有另外一半数据:tee的标准输出,但因为后面没有跟其它的命令,所以这份输出相当于被抛弃。当然也可以在后面补上> /dev/null,以显式的丢弃标准输出,但是这对整个操作没有影响,而且会增加输入的字符数,因此只需上述命令即可。
命令执行之后
运行完上述命令后,会出现下面的提示:
Vim提示文件更新,询问是确认还是重新加载文件。建议直接输入O,因为这样可以保留Vim的工作状态,比如编辑历史,buffer等,撤消等操作仍然可以继续。而如果选择L,文件会以全新的文件打开,所有的工作状态便丢失了,此时无法执行撤消,buffer中的内容也被清空。
更简单的方案:映射
上述方式非常完美的解决了文章开始提出的问题,但毕竟命令还是有些长,为了避免每次输入一长串的命令,可以将它映射为一个简单的命令加到.vimrc中:
这样,简单的运行:w!!即可。命令后半部分> /dev/null在前面已经解释过,作用为显式的丢掉标准输出的内容。
另一种思路
至此,一个比较完美但很tricky的方案已经完成。你可能会问,为什么不用下面这样更常见的命令呢?这不是更容易理解,更简单一些么?
:w !sudo cat > %
重定向的问题
我们来分析一遍,像前面一样,它可以被转换为相同功能的shell命令:
$ cat readonly-file-name | sudo cat > %
这条命令看起来一点问题没有,可一旦运行,又会出现另外一个错误:
/bin/sh: readonly-file-name: Permission denied shell returned 1
这是怎么回事?不是明明加了sudo么,为什么还提示说没有权限?稍安勿躁,原因在于重定向,它是由shell执行的,在一切命令开始之前,shell便会执行重定向操作,所以重定向并未受sudo影响,而当前的shell本身也是以普通用户身份启动,也没有权限写此文件,因此便有了上面的错误。
重定向方案
这里介绍了几种解决重定向无权限错误的方法,当然除了tee方案以外,还有一种比较方便的方案:以sudo打开一个shell,然后在该具有root权限的shell中执行含重定向的命令,如:
:w !sudo sh -c 'cat > %'
可是这样执行时,由于单引号的存在,所以在Vim中%并不会展开,它被原封不动的传给了shell,而在shell中,一个单独的%相当于nil,所以文件被重定向到了nil,所有内容丢失,保存文件失败。
既然是由于%没有展开导致的错误,那么试着将单引号'换成双引号"再试一次:
:w !sudo sh -c "cat > %"
成功!这是因为在将命令传到shell去之前,%已经被扩展为当前的文件名。有关单引号和双引号的区别可以参考这里,简单的说就是单引号会将其内部的内容原封不动的传给命令,但是双引号会展开一些内容,比如变量,转义字符等。
当然,也可以像前面一样将它映射为一个简单的命令并添加到.vimrc中:
注意:这里不再需要把输出重定向到/dev/null中。
写在结尾
至此,借助Vim强大的灵活性,实现了两种方案,可以在以普通用户启动的Vim中保存需root权限的文件。两者的原理类似,都是利用了Vim可以执行外部命令这一特性,区别在于使用不同的shell命令。如果你还有其它的方案,欢迎给我留言。
来自:
http://www.kuqin.com/shuoit/20140731/341487.html
http://blog.csdn.net/xinhaozheng/article/details/5756838
http://segmentfault.com/q/1010000000130006
[实践OK]Linux下多核CPU使用率查询情况。
Unix/LinuxC技术 jackxiang 2014-9-29 21:11
top使用_交互命令:
1、输入1可以看到CPU各个核的CPU负载(us,sy,id,wa等)
2、输入shift+p按CPU占用率排序
3、shift+m按内存占用率排序,
4 u然后输入用户名,查看指定用户的进程信息,shift+t按CPU用时排序,shift+n按PID排序
重点讲下第一条:
1、输入1可以看到CPU各个核的CPU负载
Cpu0 : 1.0%us, 3.0%sy, 0.0%ni, 96.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
这里对us,sy,ni,id,wa,hi,si,st进行分别说明:
us 列显示了用户模式下所花费 CPU 时间的百分比。
us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。
这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
ni 列显示了用户进程空间内改变过优先级的进程占用CPU百分比。
id 列显示了cpu处在空闲状态的时间百分比。
wa 列显示了IO等待所占用的CPU时间的百分比。
这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。 //这个wa和vmstat中的wa是相同含义
hi 硬件中断占用CPU
si 软件中断占用CPU
st 丢失时间占用CPU
在后台服务器开发中需要关注us,sy,id,wa等常用指标。
更多:http://blog.163.com/xychenbaihu@yeah/blog/static/1322296552012017105732762/
1、输入1可以看到CPU各个核的CPU负载(us,sy,id,wa等)
2、输入shift+p按CPU占用率排序
3、shift+m按内存占用率排序,
4 u然后输入用户名,查看指定用户的进程信息,shift+t按CPU用时排序,shift+n按PID排序
重点讲下第一条:
1、输入1可以看到CPU各个核的CPU负载
Cpu0 : 1.0%us, 3.0%sy, 0.0%ni, 96.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
这里对us,sy,ni,id,wa,hi,si,st进行分别说明:
us 列显示了用户模式下所花费 CPU 时间的百分比。
us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。
这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
ni 列显示了用户进程空间内改变过优先级的进程占用CPU百分比。
id 列显示了cpu处在空闲状态的时间百分比。
wa 列显示了IO等待所占用的CPU时间的百分比。
这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。 //这个wa和vmstat中的wa是相同含义
hi 硬件中断占用CPU
si 软件中断占用CPU
st 丢失时间占用CPU
在后台服务器开发中需要关注us,sy,id,wa等常用指标。
更多:http://blog.163.com/xychenbaihu@yeah/blog/static/1322296552012017105732762/
升级mysql到5.6.21 Php升级为5.6.0后bo-blog出现乱码的问题解决。
Php/Js/Shell/Go jackxiang 2014-9-29 17:43
背景:最近升级mysql到: 5.6.21,PHP也升级到php-5.6.0,发现博客成乱码了。
解决办法:
my.cnf
备注:
Php升级为5.6.0后注意OPCache生成扩展路径和PHP5.5.32位置不一样,否则会报:
The Zend Engine API version 220131226 which is installed, is newer.
解决办法:
my.cnf
备注:
Php升级为5.6.0后注意OPCache生成扩展路径和PHP5.5.32位置不一样,否则会报:
The Zend Engine API version 220131226 which is installed, is newer.