[转]shell脚本执行时报"bad interpreter: Text file busy"的解决方法
Php/Js/Shell/Go jackxiang 2015-12-22 21:35
在执行一个shell脚本时,遇到了“-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy”错误提示,如下所示:
[oracle@DB-Server bin]$ ./killSession.sh
-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy
此时只需要在#!/bin/bash,加一空格#! /bin/bash即可解决问题。
另外一种情况: 当有其它进程访问这个文件,可以通过lsof | grep killSession.sh来查看是否有其它进程正在访问该文件。
此时可以用kill命令杀掉其它进程。解决上面这个问题。
转自:http://www.cnblogs.com/kerrycode/p/4038934.html
[oracle@DB-Server bin]$ ./killSession.sh
-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy
此时只需要在#!/bin/bash,加一空格#! /bin/bash即可解决问题。
另外一种情况: 当有其它进程访问这个文件,可以通过lsof | grep killSession.sh来查看是否有其它进程正在访问该文件。
此时可以用kill命令杀掉其它进程。解决上面这个问题。
转自:http://www.cnblogs.com/kerrycode/p/4038934.html
背景:升级了一下mysql到最新版本 5.7.9,博客数据没有动,后导出数据备份时出现Couldn't execute 'SHOW VARIABLES LIKE 'gtid\_mode'',加上 --set-gtid-purged=off出现新错误的问题,总之一堆问题,最后还是终于导出了,特别是升级后一定要重启,啥玩意,艹。
实践如下,出现问题:
[root@iZ25dcp92ckZ backup]# mysqldump -uroot -p -ujustwinit_mysql_database > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'gtid\_mode'': Table 'performance_schema.session_variables' doesn't exist (1146)
用mysqldump备份时出现下面的出错信息:
mysqldump:Couldn't execute ‘SELECT @@GTID_MODE':Unknown system variable 'GTID_MODE' (1193)
造成此错误的原因是因为5.6引入了Global Transaction Identifiers (GTIDs) 。GTIDs可以让主从结构复制的跟踪和比较变得简单。mysqldump会试图查询这个系统变量,但这个变量在5.6之前的版本中不存在,所以产生错误。解决的方法很简单,在mysqldump后加上–set-gtid-purged=OFF命令
如:
mysqldump -h(主机名或ip) -u(用户名) -p(密码) 数据库名 --set-gtid-purged=off >d:/db.sql
From:http://www.rjkfw.com/s_3139.html
___________________________________________________________________
[root@iZ25dcp92ckZ ~]# mysqldump --set-gtid-purged=off -uroot -p -ujustwinit_mysql_database > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'ndbinfo\_version'': Table 'performance_schema.session_variables' doesn't exist (1146)
解决办法:
[root@iZ25dcp92ckZ ~]# mysql_upgrade -u root -p --force
Enter password:
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv OK
mysql.db OK
。。。。。。
sys.sys_config OK
temperature.temperature OK
temperature.tempsetting OK
Upgrade process completed successfully.
Checking if update is needed.
再次导出:
[root@iZ25dcp92ckZ ~]# mysqldump --set-gtid-purged=off -uroot -p -ujustwinit_mysql_database > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'ndbinfo\_version'': Native table 'performance_schema'.'session_variables' has the wrong structure (1682)
忘记重启了,于是重启下,再次导出,出现新的错:
[root@iZ25dcp92ckZ bin]# mysqldump --set-gtid-purged=off -u-ujustwinit_mysql_database_mysql_database -p -ujustwinit_mysql_database_mysql > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Got error: 1044: Access denied for user '-ujustwinit_mysql_database_mysql'@'localhost' to database '-ujustwinit_mysql_database_mysql' when using LOCK TABLES
用mysqldump备份数据库时出现when using LOCK TABLES_:
--skip-lock-tables
普通用户备份mysql 数据库报错
mysql 无lock tables权限 报Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES
主要原因是该用户无lock tables 该权限,处理办法:
1. 给该普通用户赋予lock tables 权限,建议是删除该用户,重新用mysql命令建
2. 加上--skip-lock-tables即可
mysqldump -udbuser -p dbname --skip-lock-tables > dbname.sql
3. 使用root 备份
MySQL无lock tables权限 报Access denied for user when using LOCK TABLES:
http://www.linuxidc.com/Linux/2012-01/51802.htm
mysqldump --set-gtid-purged=off --skip-lock-tables -u-ujustwinit_mysql_database_mysql_database -p -ujustwinit_mysql_database_mysql > -ujustwinit_mysql_database.cn.sql
成功了:
[root@iZ25dcp92ckZ bin]# mysqldump --set-gtid-purged=off --skip-lock-tables -uroot -p justwinit_mysql_database > jackxiang.com.database.bak.perfected.2015.12.29.sql
Enter password:
来自:http://www.amznz.com/error-native-table-performance_schema/
实践如下,出现问题:
[root@iZ25dcp92ckZ backup]# mysqldump -uroot -p -ujustwinit_mysql_database > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'gtid\_mode'': Table 'performance_schema.session_variables' doesn't exist (1146)
用mysqldump备份时出现下面的出错信息:
mysqldump:Couldn't execute ‘SELECT @@GTID_MODE':Unknown system variable 'GTID_MODE' (1193)
造成此错误的原因是因为5.6引入了Global Transaction Identifiers (GTIDs) 。GTIDs可以让主从结构复制的跟踪和比较变得简单。mysqldump会试图查询这个系统变量,但这个变量在5.6之前的版本中不存在,所以产生错误。解决的方法很简单,在mysqldump后加上–set-gtid-purged=OFF命令
如:
mysqldump -h(主机名或ip) -u(用户名) -p(密码) 数据库名 --set-gtid-purged=off >d:/db.sql
From:http://www.rjkfw.com/s_3139.html
___________________________________________________________________
[root@iZ25dcp92ckZ ~]# mysqldump --set-gtid-purged=off -uroot -p -ujustwinit_mysql_database > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'ndbinfo\_version'': Table 'performance_schema.session_variables' doesn't exist (1146)
解决办法:
[root@iZ25dcp92ckZ ~]# mysql_upgrade -u root -p --force
Enter password:
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv OK
mysql.db OK
。。。。。。
sys.sys_config OK
temperature.temperature OK
temperature.tempsetting OK
Upgrade process completed successfully.
Checking if update is needed.
再次导出:
[root@iZ25dcp92ckZ ~]# mysqldump --set-gtid-purged=off -uroot -p -ujustwinit_mysql_database > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'ndbinfo\_version'': Native table 'performance_schema'.'session_variables' has the wrong structure (1682)
忘记重启了,于是重启下,再次导出,出现新的错:
[root@iZ25dcp92ckZ bin]# mysqldump --set-gtid-purged=off -u-ujustwinit_mysql_database_mysql_database -p -ujustwinit_mysql_database_mysql > -ujustwinit_mysql_database.cn.sql
Enter password:
mysqldump: Got error: 1044: Access denied for user '-ujustwinit_mysql_database_mysql'@'localhost' to database '-ujustwinit_mysql_database_mysql' when using LOCK TABLES
用mysqldump备份数据库时出现when using LOCK TABLES_:
--skip-lock-tables
普通用户备份mysql 数据库报错
mysql 无lock tables权限 报Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES
主要原因是该用户无lock tables 该权限,处理办法:
1. 给该普通用户赋予lock tables 权限,建议是删除该用户,重新用mysql命令建
2. 加上--skip-lock-tables即可
mysqldump -udbuser -p dbname --skip-lock-tables > dbname.sql
3. 使用root 备份
MySQL无lock tables权限 报Access denied for user when using LOCK TABLES:
http://www.linuxidc.com/Linux/2012-01/51802.htm
mysqldump --set-gtid-purged=off --skip-lock-tables -u-ujustwinit_mysql_database_mysql_database -p -ujustwinit_mysql_database_mysql > -ujustwinit_mysql_database.cn.sql
成功了:
[root@iZ25dcp92ckZ bin]# mysqldump --set-gtid-purged=off --skip-lock-tables -uroot -p justwinit_mysql_database > jackxiang.com.database.bak.perfected.2015.12.29.sql
Enter password:
来自:http://www.amznz.com/error-native-table-performance_schema/
PHP filesize() 函数是有缓存的,你需要清除文件状态缓存。
Php/Js/Shell/Go jackxiang 2015-12-17 19:01
背景:有时有做一些H5的websocket做模仿linux下的tail -f,形成一个实时日志查看工具时,会对写入事件前的文件大小和写入事件后的文件大小作一个计算,而在实际调试时发现这个PHP的filessize函数是有缓存的,这个链接的兄弟在问怎么破?(http://segmentfault.com/q/1010000003843245),如下文所示 。
定义和用法
clearstatcache()函数的作用是:清除文件状态缓存。
PHP的缓存数据对更快更好的运行函数是非常有利的。如果一个文件在脚本中测试了多次,你也许会禁止对正确的结果进行缓存。为了实现这点,你可以使用clearstatcache()函数。
语法
clearstatcache()
提示和注意
提示:执行缓存的函数:
stat()
lstat()
file_exists()
is_writable()
is_readable()
is_executable()
is_file()
is_dir()
is_link()
filectime()
fileatime()
filemtime()
fileinode()
filegroup()
fileowner()
filesize()
filetype()
fileperms()
案例
上述代码将输出下面的结果:
事件前文件大小:59635
事件后文件大小:59639
来自:http://www.chinaz.com/program/2010/0302/107501.shtml
定义和用法
clearstatcache()函数的作用是:清除文件状态缓存。
PHP的缓存数据对更快更好的运行函数是非常有利的。如果一个文件在脚本中测试了多次,你也许会禁止对正确的结果进行缓存。为了实现这点,你可以使用clearstatcache()函数。
语法
clearstatcache()
提示和注意
提示:执行缓存的函数:
stat()
lstat()
file_exists()
is_writable()
is_readable()
is_executable()
is_file()
is_dir()
is_link()
filectime()
fileatime()
filemtime()
fileinode()
filegroup()
fileowner()
filesize()
filetype()
fileperms()
案例
上述代码将输出下面的结果:
事件前文件大小:59635
事件后文件大小:59639
来自:http://www.chinaz.com/program/2010/0302/107501.shtml
背景:想测试android的pad浏览器屏幕的显示情况,而测试机没有网络,如果用wifi热点作fiddler2的代理也成,可是不是人人都有代理,最好是修改一下host文件。
最近在做的项目要通过域名调用内网的服务器,因为android模拟器host文件无法修改,导致无法通过域名使用http方法调用内网服务,因此从网上大量转载的一种方法,这种方法:
1. 通过emulator -avd avdName -partition-size 128 启动模拟器
2.通过adb root 和 adb remount 命令获得root权限。
3.通过 adb pull /system/etc/hosts 命令将hosts文件转移到PC上,手动修改hosts,并且通过adb push将hosts文件再推送回去。
这个问题是因为linux中的换行符和window中的回车换行不一致引起的,网上大部分方法是让利用ultraedit等编辑器直接修改,但是我复制到编辑器上依然无法修改。上贴中的malbers回复说,利用echo命令,可以直接通过命令将需要修改的内容添加到hosts文件中,试了一下,果然可行。
首先键入 adb shell 命令(新版本的sdk adb命令被转移到了platform-tools目录中),然后echo 192.168.0.246 www.aaa.com>>/system/etc/hosts,敲入上面这条命令后,再使用 cat /system/etc/hosts查看hosts文件修改情况,发现hosts果然已经被修改,但是问题是依然没有换行,貌似只有换行了以后才能被识别,
因此再次利用echo命令加入了换行符,问题解决。具体操作如下:
前面几个步骤不变,但是不需要将hosts文件pull到电脑上,如果你已经修改了但是无效,可以先pull出来,还原到原始状态,不要有任何换行,并替换掉
模拟器上已经修改的hosts,使它回复到原始状态。即只有127.0.0.1 localhost。
然后进入adb shell , 使用 echo -e \\n >> /system/etc/hosts 为hosts文件加入换行符。
再次使用 echo 192.168.0.246 www.aaa.com >> /system/etc/hosts 。
这样就完整解决了换行问题。再次在浏览器中敲入www.aaa.com,熟悉的页面也出现了。
转自:http://blog.csdn.net/landen11/article/details/7022376
首先请确认你修改的是文件是 /system/etc/hosts ,如果不是,那你即使改了也无效。
其次,如果你是在windows下修改hosts文件,那就必须注意换行符的问题,以及hosts文件格式的问题:
android下的hosts文件必须像以下这样写:
IP 域名
注意:
在IP和域名之间保留一个空格 每行只能有一个域名,不能一个IP后面跟多个域名。
android上的换行符(也就是回车)是LF,也就是\n,而windows上的换行符是CR LF,也就是\r\n
所以在windows下用记事本之类的软件编辑了hosts文件,放到手机上肯定认不出来的!解决的办法就是用NotePad++之类的文本编辑器,再使用“查找替换”,将“\r\n”替换成“\n”(注意要在notepad++里把查找模式设置为扩展模式,才能识别转义字符\r\n)
如果是在windows下编辑hosts,要保证最后一行结尾也是“\n”
终于搞掂!!!
转自:https://plus.google.com/105237252862440264277/posts/CF9F42e4axj
最近在做的项目要通过域名调用内网的服务器,因为android模拟器host文件无法修改,导致无法通过域名使用http方法调用内网服务,因此从网上大量转载的一种方法,这种方法:
1. 通过emulator -avd avdName -partition-size 128 启动模拟器
2.通过adb root 和 adb remount 命令获得root权限。
3.通过 adb pull /system/etc/hosts 命令将hosts文件转移到PC上,手动修改hosts,并且通过adb push将hosts文件再推送回去。
这个问题是因为linux中的换行符和window中的回车换行不一致引起的,网上大部分方法是让利用ultraedit等编辑器直接修改,但是我复制到编辑器上依然无法修改。上贴中的malbers回复说,利用echo命令,可以直接通过命令将需要修改的内容添加到hosts文件中,试了一下,果然可行。
首先键入 adb shell 命令(新版本的sdk adb命令被转移到了platform-tools目录中),然后echo 192.168.0.246 www.aaa.com>>/system/etc/hosts,敲入上面这条命令后,再使用 cat /system/etc/hosts查看hosts文件修改情况,发现hosts果然已经被修改,但是问题是依然没有换行,貌似只有换行了以后才能被识别,
因此再次利用echo命令加入了换行符,问题解决。具体操作如下:
前面几个步骤不变,但是不需要将hosts文件pull到电脑上,如果你已经修改了但是无效,可以先pull出来,还原到原始状态,不要有任何换行,并替换掉
模拟器上已经修改的hosts,使它回复到原始状态。即只有127.0.0.1 localhost。
然后进入adb shell , 使用 echo -e \\n >> /system/etc/hosts 为hosts文件加入换行符。
再次使用 echo 192.168.0.246 www.aaa.com >> /system/etc/hosts 。
这样就完整解决了换行问题。再次在浏览器中敲入www.aaa.com,熟悉的页面也出现了。
转自:http://blog.csdn.net/landen11/article/details/7022376
首先请确认你修改的是文件是 /system/etc/hosts ,如果不是,那你即使改了也无效。
其次,如果你是在windows下修改hosts文件,那就必须注意换行符的问题,以及hosts文件格式的问题:
android下的hosts文件必须像以下这样写:
IP 域名
注意:
在IP和域名之间保留一个空格 每行只能有一个域名,不能一个IP后面跟多个域名。
android上的换行符(也就是回车)是LF,也就是\n,而windows上的换行符是CR LF,也就是\r\n
所以在windows下用记事本之类的软件编辑了hosts文件,放到手机上肯定认不出来的!解决的办法就是用NotePad++之类的文本编辑器,再使用“查找替换”,将“\r\n”替换成“\n”(注意要在notepad++里把查找模式设置为扩展模式,才能识别转义字符\r\n)
如果是在windows下编辑hosts,要保证最后一行结尾也是“\n”
终于搞掂!!!
转自:https://plus.google.com/105237252862440264277/posts/CF9F42e4axj
RocksDB介绍:一个比LevelDB更彪悍的引擎
Php/Js/Shell/Go jackxiang 2015-12-8 17:24
背景:听说要写rocksdb的PHP扩展,推荐到PHP官方去,一看发现这个db很牛,支持key-value的查找,Facebook开源闪存数据库RocksDB。
关于LevelDB的资料网上还是比较丰富的,如果你尚未听说过LevelDB,那请稍微预习一下,因为RocksDB实际上是在LevelDB之上做的改进。本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的看法,更详细的信息读者可参考其官网:http://rocksdb.org/
RocksDB是在LevelDB原来的代码上进行改进完善的,所以在用法上与LevelDB非常的相似。如下,就是简单的把原来Leveldb信息替换为Rocksdb,从继承的角度看,Rocksdb就像是Leveldb的后辈。
RocksDB:
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
LevelDB:
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
RocksDB虽然在代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。在云计算横行的年代,开口不离Hadoop,RocksDB也开始支持HDFS,允许从HDFS读取数据。而LevelDB则是一个比较单一的存储引擎,有点我就是我,除了我依然只有我的感觉。也是因为LevelDB的单一性,在做具体的应用的时候一般需要对其作进一步扩展。
RocksDB支持一次获取多个K-V,还支持Key范围查找。LevelDB只能获取单个Key
RocksDB除了简单的Put、Delete操作,还提供了一个Merge操作,说是为了对多个Put操作进行合并。站在引擎实现者的角度来看,相比其带来的价值,其实现的成本要昂贵很多。个人觉得有时过于追求完美不见得是好事,据笔者所测(包括测试自己编写的引擎),性能的瓶颈其实主要在合并上,多一次少一次Put对性能的影响并无大碍。
RocksDB提供一些方便的工具,这些工具包含解析sst文件中的K-V记录、解析MANIFEST文件的内容等。有了这些工具,就不用再像使用LevelDB那样,只能在程序中才能知道sst文件K-V的具体信息了。
RocksDB支持多线程合并,而LevelDB是单线程合并的。LSM型的数据结构,最大的性能问题就出现在其合并的时间损耗上,在多CPU的环境下,多线程合并那是LevelDB所无法比拟的。不过据其官网上的介绍,似乎多线程合并还只是针对那些与下一层没有Key重叠的文件,只是简单的rename而已,至于在真正数据上的合并方面是否也有用到多线程,就只能看代码了。
RocksDB增加了合并时过滤器,对一些不再符合条件的K-V进行丢弃,如根据K-V的有效期进行过滤。
压缩方面RocksDB可采用多种压缩算法,除了LevelDB用的snappy,还有zlib、bzip2。LevelDB里面按数据的压缩率(压缩后低于75%)判断是否对数据进行压缩存储,而RocksDB典型的做法是Level 0-2不压缩,最后一层使用zlib,而其它各层采用snappy。
在故障方面,RocksDB支持增量备份和全量备份,允许将已删除的数据备份到指定的目录,供后续恢复。
RocksDB支持在单个进程中启用多个实例,而LevelDB只允许单个实例。
RocksDB支持管道式的Memtable,也就说允许根据需要开辟多个Memtable,以解决Put与Compact速度差异的性能瓶颈问题。在LevelDB里面因为只有一个Memtable,如果Memtable满了却还来不及持久化,这个时候LevelDB将会减缓Put操作,导致整体性能下降。笔者目前写的引擎在这方面竟然跟RocksDB不谋而合,这里偷偷乐一下,呵呵。
看完上面这些介绍,相比LevelDB是不是觉得RocksDB彪悍的不可思议,很多该有的地方都有,该想的都想到了,简直不像在做引擎库,更像是在做产品。不过虽然RocksDB在性能上提升了不少,但在文件存储格式上跟LevelDB还是没什么变化的, 稍微有点更新的只是RocksDB对原来LevelDB中sst文件预留下来的MetaBlock进行了具体利用。
个人觉得RocksDB尚未解决的地方:
依然是完全依赖于MANIFEST,一当该文件丢失,则整个数据库基本废掉。
合并上依然是整个文件载入,一些没用的Value将被多次的读入内存,如果这些Value很大的话,那没必要的内存占用将是一个可观的成本。
关于这两个问题,尤其是后面那个问题,笔者已有相应的解决方案,至于结果如何只等日后实现之后再作解说了。
来自:http://tech.uc.cn/?p=2592
关于LevelDB的资料网上还是比较丰富的,如果你尚未听说过LevelDB,那请稍微预习一下,因为RocksDB实际上是在LevelDB之上做的改进。本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的看法,更详细的信息读者可参考其官网:http://rocksdb.org/
RocksDB是在LevelDB原来的代码上进行改进完善的,所以在用法上与LevelDB非常的相似。如下,就是简单的把原来Leveldb信息替换为Rocksdb,从继承的角度看,Rocksdb就像是Leveldb的后辈。
RocksDB:
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
LevelDB:
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
RocksDB虽然在代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。在云计算横行的年代,开口不离Hadoop,RocksDB也开始支持HDFS,允许从HDFS读取数据。而LevelDB则是一个比较单一的存储引擎,有点我就是我,除了我依然只有我的感觉。也是因为LevelDB的单一性,在做具体的应用的时候一般需要对其作进一步扩展。
RocksDB支持一次获取多个K-V,还支持Key范围查找。LevelDB只能获取单个Key
RocksDB除了简单的Put、Delete操作,还提供了一个Merge操作,说是为了对多个Put操作进行合并。站在引擎实现者的角度来看,相比其带来的价值,其实现的成本要昂贵很多。个人觉得有时过于追求完美不见得是好事,据笔者所测(包括测试自己编写的引擎),性能的瓶颈其实主要在合并上,多一次少一次Put对性能的影响并无大碍。
RocksDB提供一些方便的工具,这些工具包含解析sst文件中的K-V记录、解析MANIFEST文件的内容等。有了这些工具,就不用再像使用LevelDB那样,只能在程序中才能知道sst文件K-V的具体信息了。
RocksDB支持多线程合并,而LevelDB是单线程合并的。LSM型的数据结构,最大的性能问题就出现在其合并的时间损耗上,在多CPU的环境下,多线程合并那是LevelDB所无法比拟的。不过据其官网上的介绍,似乎多线程合并还只是针对那些与下一层没有Key重叠的文件,只是简单的rename而已,至于在真正数据上的合并方面是否也有用到多线程,就只能看代码了。
RocksDB增加了合并时过滤器,对一些不再符合条件的K-V进行丢弃,如根据K-V的有效期进行过滤。
压缩方面RocksDB可采用多种压缩算法,除了LevelDB用的snappy,还有zlib、bzip2。LevelDB里面按数据的压缩率(压缩后低于75%)判断是否对数据进行压缩存储,而RocksDB典型的做法是Level 0-2不压缩,最后一层使用zlib,而其它各层采用snappy。
在故障方面,RocksDB支持增量备份和全量备份,允许将已删除的数据备份到指定的目录,供后续恢复。
RocksDB支持在单个进程中启用多个实例,而LevelDB只允许单个实例。
RocksDB支持管道式的Memtable,也就说允许根据需要开辟多个Memtable,以解决Put与Compact速度差异的性能瓶颈问题。在LevelDB里面因为只有一个Memtable,如果Memtable满了却还来不及持久化,这个时候LevelDB将会减缓Put操作,导致整体性能下降。笔者目前写的引擎在这方面竟然跟RocksDB不谋而合,这里偷偷乐一下,呵呵。
看完上面这些介绍,相比LevelDB是不是觉得RocksDB彪悍的不可思议,很多该有的地方都有,该想的都想到了,简直不像在做引擎库,更像是在做产品。不过虽然RocksDB在性能上提升了不少,但在文件存储格式上跟LevelDB还是没什么变化的, 稍微有点更新的只是RocksDB对原来LevelDB中sst文件预留下来的MetaBlock进行了具体利用。
个人觉得RocksDB尚未解决的地方:
依然是完全依赖于MANIFEST,一当该文件丢失,则整个数据库基本废掉。
合并上依然是整个文件载入,一些没用的Value将被多次的读入内存,如果这些Value很大的话,那没必要的内存占用将是一个可观的成本。
关于这两个问题,尤其是后面那个问题,笔者已有相应的解决方案,至于结果如何只等日后实现之后再作解说了。
来自:http://tech.uc.cn/?p=2592
[实践OK]创建从0-9的目录结构层次,shell输出a-z,A-Z,0-9的脚本。
Unix/LinuxC技术 jackxiang 2015-12-8 09:41
背景:Nginx的断点上传这块涉及到一个创建散列目录的的情况,这块得从0-9,a-z,A-Z, 搜索了一下网上,用awk比较吃香。
________________________________________________________________________________
参考:http://blog.csdn.net/ghosc/article/details/5721178
awk如何输出A-Z ,网上高手很多:
不用麻烦awk了
这样就行了
那个echo {A..Z}够牛逼的~~
http://bbs.chinaunix.net/thread-1815653-1-1.html
________________________________________________________________________________
参考:http://blog.csdn.net/ghosc/article/details/5721178
awk如何输出A-Z ,网上高手很多:
不用麻烦awk了
这样就行了
那个echo {A..Z}够牛逼的~~
http://bbs.chinaunix.net/thread-1815653-1-1.html
背景:现在H5做上传呢,想有好的用户体验是直接提交ajax上传文件,其实用form跳转也是可以的,不是说用户体验不好嘛,其实我觉得也没啥不好的,只要提示明确就好,非要在一个页面上做所有的操作,这是产品挖空心思想的问题,为什么不能呢,这儿有一个兄弟告诉我们说能的。其主要是设置http的header头符合一些h5的跨域规范就成(像Flash有一个xml文件作验证的,Flash不行了,咱还是H5吧。),这块啥语言都能设置头,包括nginx的conf文件里也能设置(http://www.anrip.com/post/1501 ,http://blog.csdn.net/oyzl68/article/details/18741057(讲到两次请求,这更像是flash的那套作法了,这块服务端配置上可能会不大一样。),html5rocks.com 上面的头返回可参考。),先转下,尽管没有通知作者。
选择了http头来实现跨越的原理概述:
ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全。
即使使用jquery的jsonp方法,type设为POST,也会自动变为GET。
官方问题说明:
“script”: Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, “_=[TIMESTAMP]“, to the URL unless the cache option is set to true.Note: This will turn POSTs into GETs for remote-domain requests.
如果跨域使用POST方式,可以使用创建一个隐藏的iframe来实现,与ajax上传图片原理一样,但这样会比较麻烦。
——————————————————————————————————————————————————————————————
ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全。
即使使用jquery的jsonp方法,type设为POST,也会自动变为GET。
官方问题说明:
“script”: Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, “_=[TIMESTAMP]“, to the URL unless the cache option is set to true.Note: This will turn POSTs into GETs for remote-domain requests.
如果跨域使用POST方式,可以使用创建一个隐藏的iframe来实现,与ajax上传图片原理一样,但这样会比较麻烦。
因此,通过设置Access-Control-Allow-Origin来实现跨域访问比较简单。
例如:客户端的域名是www.client.com,而请求的域名是www.server.com
如果直接使用ajax访问,会有以下错误
XMLHttpRequest cannot load http://www.server.com/server.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.client.com' is therefore not allowed access.
在被请求的Response header中加入
就可以实现ajax POST跨域访问了。
代码如下:
client.html 路径:http://www.client.com/client.html
server.php 路径:http://www.server.com/server.php
Access-Control-Allow-Origin:* 表示允许任何域名跨域访问
如果需要指定某域名才允许跨域访问,只需把Access-Control-Allow-Origin:*改为Access-Control-Allow-Origin:允许的域名
例如:header('Access-Control-Allow-Origin:http://www.client.com');
如果需要设置多个域名允许访问,这里需要用php处理一下
例如允许 www.client.com 与 www.client2.com 可以跨域访问
server.php 修改为
源码下载地址:http://download.csdn.net/detail/fdipzone/8779657
该文转自:http://blog.csdn.net/fdipzone/article/details/46390573
选择了http头来实现跨越的原理概述:
ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全。
即使使用jquery的jsonp方法,type设为POST,也会自动变为GET。
官方问题说明:
“script”: Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, “_=[TIMESTAMP]“, to the URL unless the cache option is set to true.Note: This will turn POSTs into GETs for remote-domain requests.
如果跨域使用POST方式,可以使用创建一个隐藏的iframe来实现,与ajax上传图片原理一样,但这样会比较麻烦。
——————————————————————————————————————————————————————————————
ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全。
即使使用jquery的jsonp方法,type设为POST,也会自动变为GET。
官方问题说明:
“script”: Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, “_=[TIMESTAMP]“, to the URL unless the cache option is set to true.Note: This will turn POSTs into GETs for remote-domain requests.
如果跨域使用POST方式,可以使用创建一个隐藏的iframe来实现,与ajax上传图片原理一样,但这样会比较麻烦。
因此,通过设置Access-Control-Allow-Origin来实现跨域访问比较简单。
例如:客户端的域名是www.client.com,而请求的域名是www.server.com
如果直接使用ajax访问,会有以下错误
XMLHttpRequest cannot load http://www.server.com/server.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.client.com' is therefore not allowed access.
在被请求的Response header中加入
就可以实现ajax POST跨域访问了。
代码如下:
client.html 路径:http://www.client.com/client.html
server.php 路径:http://www.server.com/server.php
Access-Control-Allow-Origin:* 表示允许任何域名跨域访问
如果需要指定某域名才允许跨域访问,只需把Access-Control-Allow-Origin:*改为Access-Control-Allow-Origin:允许的域名
例如:header('Access-Control-Allow-Origin:http://www.client.com');
如果需要设置多个域名允许访问,这里需要用php处理一下
例如允许 www.client.com 与 www.client2.com 可以跨域访问
server.php 修改为
源码下载地址:http://download.csdn.net/detail/fdipzone/8779657
该文转自:http://blog.csdn.net/fdipzone/article/details/46390573
linux下的/opt目录是做什么用的?空间不够了可以挪走。
Unix/LinuxC技术 jackxiang 2015-12-4 11:58
/opt 主机额外安装软件所摆放的目录。默认是空的。 一般安装软件的时候,可以自己指定安装到这个目录下,便于查找和管理:
[root@localhost opt]# ls /opt
20120207 mysql-5.6.11
/根空间太小大了,直接挪动到其它盘符(data目录大: 171G 39G 123G 24% /data),做个软链接:
/opt -> /data/backdata/opt
[root@localhost opt]# ls /opt
20120207 mysql-5.6.11
/根空间太小大了,直接挪动到其它盘符(data目录大: 171G 39G 123G 24% /data),做个软链接:
/opt -> /data/backdata/opt
使用MegaCli工具查看Raid磁盘阵列状态
Unix/LinuxC技术 jackxiang 2015-12-4 11:28
MegaCli-1.01.39-0.i386.rpm
[root@localhost ~]# rpm -qa|grep MegaCli
MegaCli-1.01.39-0
/opt/MegaRAID/MegaCli/MegaCli
/opt/MegaRAID/MegaCli/MegaCli64
/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL //查看硬盘信息
阅读全文
[root@localhost ~]# rpm -qa|grep MegaCli
MegaCli-1.01.39-0
/opt/MegaRAID/MegaCli/MegaCli
/opt/MegaRAID/MegaCli/MegaCli64
/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL //查看硬盘信息
阅读全文
背景:windows的cmd下复制很麻烦,clip一定程序上可以减少复制的麻烦,直接把执行完的结构复制到粘贴板。
内容可能是一堆的命令或exe的执行输出都可以复制在粘贴板上,因为cmd下复制太憋屈了,这个命令有点用。
dir |clip
内容可能是一堆的命令或exe的执行输出都可以复制在粘贴板上,因为cmd下复制太憋屈了,这个命令有点用。
dir |clip
如何强制在下次登录Linux时更换密码
Unix/LinuxC技术 jackxiang 2015-12-4 08:26
提问:我管理着一台多人共享的Linux服务器。我刚使用默认密码创建了一个新用户,但是我想用户在第一次登录时更换密码。有没有什么方法可以让他/她在下次登录时修改密码呢?
在多用户Linux环境中,标准实践是使用一个默认的随机密码创建一个用户账户。成功登录后,新用户自己改变默认密码。出于安全考虑,经常建议“强制”用户在第一次登录时修改密码来确保这个一次性使用的密码不会再被使用。
下面是如何强制用户在下次登录时修改他/她的密码。
每个Linux用户都关联这不同的密码相关配置和信息。比如,记录着上次密码更改的日期、最小/最大的修改密码的天数、密码何时过期等等。
一个叫chage的命令行工具可以访问并调整密码过期相关配置。你可以使用这个工具来强制用户在下次登录修改密码、
要查看特定用户的过期信息(比如:alice),运行下面的命令。注意的是除了你自己之外查看其他任何用户的密码信息都需要root权限。
$ sudo chage -l alice
强制用户修改密码
如果你想要强制用户去修改他/她的密码,使用下面的命令。
$ sudo chage -d0 <user-name>
原本“-d ”参数是用来设置密码的“年龄”(也就是上次修改密码起到1970/1/1起的天数)。因此“-d0”的意思是上次密码修改的时间是1970/1/1,这就让当前的密码过期了,也就强制让他在下次登录的时候修改密码了。
另外一个过期当前密码的方式是用passwd命令。
$ sudo passwd -e <user-name>
上面的命令和“chage -d0”作用一样,让当前用户的密码立即过期。
现在检查用户的信息,你会发现:
当你再次登录时候,你会被要求修改密码。你会在修改前被要求再验证一次当前密码。
摘录:http://m.toutiao.com/i6210940210904826370/?tt_from=android_share&iid=3151331199&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
在多用户Linux环境中,标准实践是使用一个默认的随机密码创建一个用户账户。成功登录后,新用户自己改变默认密码。出于安全考虑,经常建议“强制”用户在第一次登录时修改密码来确保这个一次性使用的密码不会再被使用。
下面是如何强制用户在下次登录时修改他/她的密码。
每个Linux用户都关联这不同的密码相关配置和信息。比如,记录着上次密码更改的日期、最小/最大的修改密码的天数、密码何时过期等等。
一个叫chage的命令行工具可以访问并调整密码过期相关配置。你可以使用这个工具来强制用户在下次登录修改密码、
要查看特定用户的过期信息(比如:alice),运行下面的命令。注意的是除了你自己之外查看其他任何用户的密码信息都需要root权限。
$ sudo chage -l alice
强制用户修改密码
如果你想要强制用户去修改他/她的密码,使用下面的命令。
$ sudo chage -d0 <user-name>
原本“-d ”参数是用来设置密码的“年龄”(也就是上次修改密码起到1970/1/1起的天数)。因此“-d0”的意思是上次密码修改的时间是1970/1/1,这就让当前的密码过期了,也就强制让他在下次登录的时候修改密码了。
另外一个过期当前密码的方式是用passwd命令。
$ sudo passwd -e <user-name>
上面的命令和“chage -d0”作用一样,让当前用户的密码立即过期。
现在检查用户的信息,你会发现:
当你再次登录时候,你会被要求修改密码。你会在修改前被要求再验证一次当前密码。
摘录:http://m.toutiao.com/i6210940210904826370/?tt_from=android_share&iid=3151331199&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
[实践OK]llinux/Unix上输出Linux或freeBSD的Logo,FreeBSD下用screenfetch显示带有酷炫Linux标志的基本硬件信息。
Unix/LinuxC技术 jackxiang 2015-12-4 08:20
用 screenfetch 和 linux:
http://m.toutiao.com/i6212380828834447873/?tt_from=android_share&iid=3188867042&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
来自:http://os.51cto.com/art/201511/496107.htm
http://m.toutiao.com/i6212380828834447873/?tt_from=android_share&iid=3188867042&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
来自:http://os.51cto.com/art/201511/496107.htm
[调试]Core Dump是什么?Linux下正确永久开启
Unix/LinuxC技术 jackxiang 2015-12-4 08:17
Core Dump是什么?
Core Dump乍听之下很抽象。
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。
我们可以认为Core Dump是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时dump下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。
Core Dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 Core Dump 文件可以再现程序出错时的情景。
在半导体作为电脑内存材料之前,电脑内存使用的是 磁芯内存(Magnetic Core Memory),Core Dump 中的 Core 沿用了磁芯内存的 Core 表达。图为磁芯内存的一个单元,来自 Wikipedia.
在 APUE 一书中作者有句话这样写的:
Because the file is named core, it shows how long this feature has been part of the Unix System.
这里的Core就是沿用的是早期电脑磁芯内存中的表达,也能看出Unix系统Core Dump机制的悠久历史。
Dump 指的是拷贝一种存储介质中的部分内容到另一个存储介质,或者将内容打印、显示或者其它输出设备。dump 出来的内容是格式化的,可以使用一些工具来解析它。
现代操作系统中,用Core Dump表示当程序异常终止或崩溃时,将进程此时的内存中的内容拷贝到磁盘文件中存储,以方便编程人员调试。
如何开启Core Dump?
临时开启Core Dump,并且设置大小不受限:
命令行输入: ulimit -c unlimited
要永久打开Core Dump并且使之大小不受限,网上说有两种方法:
1. 打开 core dump 功能
在终端中输入命令 ulimit -c ,输出的结果为 0,说明默认是关闭 core dump 的,即当程序异常终止时,也不会生成 core dump 文件。
我们可以使用命令 ulimit -c unlimited 来开启 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,将 unlimited 改成你想生成 core 文件最大的大小,注意单位为 blocks(KB)。
用上面命令只会对当前的终端环境有效,如果想需要永久生效,可以修改文件 /etc/security/limits.conf文件。增加一行:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value> * soft core unlimited
2. 在/etc/profile中加入 ulimit -c unlimited
我试了以上两种方法,但是输入
ulimit -c
输出结果始终是0。
后来自己想了一种方法,在Ubuntu下可以:
编辑 .bashrc 文件:
vi ~/.bashrc
添加:
ulimit -c unlimited
保存,退出。
source ~/.bashrc
source命令使修改立即生效。
来自:http://m.toutiao.com/i6215077284911514113/?tt_from=android_share&iid=3222127616&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
Core Dump乍听之下很抽象。
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。
我们可以认为Core Dump是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时dump下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。
Core Dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 Core Dump 文件可以再现程序出错时的情景。
在半导体作为电脑内存材料之前,电脑内存使用的是 磁芯内存(Magnetic Core Memory),Core Dump 中的 Core 沿用了磁芯内存的 Core 表达。图为磁芯内存的一个单元,来自 Wikipedia.
在 APUE 一书中作者有句话这样写的:
Because the file is named core, it shows how long this feature has been part of the Unix System.
这里的Core就是沿用的是早期电脑磁芯内存中的表达,也能看出Unix系统Core Dump机制的悠久历史。
Dump 指的是拷贝一种存储介质中的部分内容到另一个存储介质,或者将内容打印、显示或者其它输出设备。dump 出来的内容是格式化的,可以使用一些工具来解析它。
现代操作系统中,用Core Dump表示当程序异常终止或崩溃时,将进程此时的内存中的内容拷贝到磁盘文件中存储,以方便编程人员调试。
如何开启Core Dump?
临时开启Core Dump,并且设置大小不受限:
命令行输入: ulimit -c unlimited
要永久打开Core Dump并且使之大小不受限,网上说有两种方法:
1. 打开 core dump 功能
在终端中输入命令 ulimit -c ,输出的结果为 0,说明默认是关闭 core dump 的,即当程序异常终止时,也不会生成 core dump 文件。
我们可以使用命令 ulimit -c unlimited 来开启 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,将 unlimited 改成你想生成 core 文件最大的大小,注意单位为 blocks(KB)。
用上面命令只会对当前的终端环境有效,如果想需要永久生效,可以修改文件 /etc/security/limits.conf文件。增加一行:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value> * soft core unlimited
2. 在/etc/profile中加入 ulimit -c unlimited
我试了以上两种方法,但是输入
ulimit -c
输出结果始终是0。
后来自己想了一种方法,在Ubuntu下可以:
编辑 .bashrc 文件:
vi ~/.bashrc
添加:
ulimit -c unlimited
保存,退出。
source ~/.bashrc
source命令使修改立即生效。
来自:http://m.toutiao.com/i6215077284911514113/?tt_from=android_share&iid=3222127616&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
如何在 Linux 上使用 SSHfs 挂载一个远程文件系统
Unix/LinuxC技术 jackxiang 2015-12-4 08:10
你曾经想过用安全 shell 挂载一个远程文件系统到本地吗?如果有的话,SSHfs 也许就是你所需要的。它通过使用 SSH 和 Fuse(LCTT 译注:Filesystem in Userspace,用户态文件系统,是 Linux 中用于挂载某些网络空间,如 SSH,到本地文件系统的模块) 允许你挂载远程计算机(或者服务器)到本地。
准备
在使用 SSHfs 挂载之前,需要进行一些设置 - 在你的系统上安装 SSHfs 以及 fuse 软件包。你还需要为 fuse 创建一个组,添加用户到组,并创建远程文件系统将会驻留的目录。
要在 Ubuntu Linux 上安装两个软件包,只需要在终端窗口输入以下命令:
sudo apt-get install sshfs fuse
如果你使用的不是 Ubuntu,那就在你的发行版软件包管理器中搜索软件包名称。最好搜索和 fuse 或 SSHfs 相关的关键字,因为取决于你运行的系统,软件包名称可能稍微有些不同。
在你的系统上安装完软件包之后,就该创建好 fuse 组了。在你安装 fuse 的时候,应该会在你的系统上创建一个组。如果没有的话,在终端窗口中输入以下命令以便在你的 Linux 系统中创建组:
sudo groupadd fuse
添加了组之后,把你的用户添加到这个组。
sudo gpasswd -a "$USER" fuse
别担心上面命令的 $USER。shell 会自动用你自己的用户名替换。处理了和组相关的工作之后,就是时候创建要挂载远程文件的目录了。
mkdir ~/remote_folder
在你的系统上创建了本地目录之后,就可以通过 SSHfs 挂载远程文件系统了。
挂载远程文件系统
要在你的机器上挂载远程文件系统,你需要在终端窗口中输入一段较长的命令。
sshfs -o idmap=user username@ip.address:/remote/file/system/ ~/remote
注意: 也可以通过 SSH 密钥文件挂载 SSHfs 文件系统。只需要在上面的命中用sshfs -o IdentityFile=~/.ssh/keyfile, 替换sshfs -o idmap=user部分。
输入这个命令之后,会提示你输入远程用户的密码。如果登录成功了,你的远程文件系统就会被挂载到之前创建的 ~/remote_folder目录。
使用完了你的远程文件系统,想要卸载它?容易吗?只需要在终端输入下面的命令:
sudo umount ~/remote_folder
这个简单的命令会断开远程连接同时清空 remote_folder 目录。
总结
在 Linux 上有很多工具可以用于访问远程文件并挂载到本地。但是如之前所说,如果有的话,也只有很少的工具能充分利用 SSH 的强大功能。我希望在这篇指南的帮助下,也能认识到 SSHfs 是一个多么强大的工具。
来自:http://m.toutiao.com/i6217571222784311809/?tt_from=android_share&iid=3250063669&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
准备
在使用 SSHfs 挂载之前,需要进行一些设置 - 在你的系统上安装 SSHfs 以及 fuse 软件包。你还需要为 fuse 创建一个组,添加用户到组,并创建远程文件系统将会驻留的目录。
要在 Ubuntu Linux 上安装两个软件包,只需要在终端窗口输入以下命令:
sudo apt-get install sshfs fuse
如果你使用的不是 Ubuntu,那就在你的发行版软件包管理器中搜索软件包名称。最好搜索和 fuse 或 SSHfs 相关的关键字,因为取决于你运行的系统,软件包名称可能稍微有些不同。
在你的系统上安装完软件包之后,就该创建好 fuse 组了。在你安装 fuse 的时候,应该会在你的系统上创建一个组。如果没有的话,在终端窗口中输入以下命令以便在你的 Linux 系统中创建组:
sudo groupadd fuse
添加了组之后,把你的用户添加到这个组。
sudo gpasswd -a "$USER" fuse
别担心上面命令的 $USER。shell 会自动用你自己的用户名替换。处理了和组相关的工作之后,就是时候创建要挂载远程文件的目录了。
mkdir ~/remote_folder
在你的系统上创建了本地目录之后,就可以通过 SSHfs 挂载远程文件系统了。
挂载远程文件系统
要在你的机器上挂载远程文件系统,你需要在终端窗口中输入一段较长的命令。
sshfs -o idmap=user username@ip.address:/remote/file/system/ ~/remote
注意: 也可以通过 SSH 密钥文件挂载 SSHfs 文件系统。只需要在上面的命中用sshfs -o IdentityFile=~/.ssh/keyfile, 替换sshfs -o idmap=user部分。
输入这个命令之后,会提示你输入远程用户的密码。如果登录成功了,你的远程文件系统就会被挂载到之前创建的 ~/remote_folder目录。
使用完了你的远程文件系统,想要卸载它?容易吗?只需要在终端输入下面的命令:
sudo umount ~/remote_folder
这个简单的命令会断开远程连接同时清空 remote_folder 目录。
总结
在 Linux 上有很多工具可以用于访问远程文件并挂载到本地。但是如之前所说,如果有的话,也只有很少的工具能充分利用 SSH 的强大功能。我希望在这篇指南的帮助下,也能认识到 SSHfs 是一个多么强大的工具。
来自:http://m.toutiao.com/i6217571222784311809/?tt_from=android_share&iid=3250063669&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
如何知道当前正在使用的 shell 是哪个?
Unix/LinuxC技术 jackxiang 2015-12-4 08:05
背景: 我经常在命令行中切换 shell。是否有一个快速简便的方法来找出我当前正在使用的 shell 呢?此外,我怎么能找到当前 shell 的版本?
其一,一个名为 "$$" 的特殊参数表示当前你正在运行的 shell 实例的 PID。此参数是只读的,不能被修改。所以,下面的命令也将显示你正在运行的 shell 的名字:
$ ps -p $$
PID TTY TIME CMD
21666 pts/4 00:00:00 bash
上述命令可在所有可用的 shell 中工作。
如果你不使用 csh,找到当前使用的 shell 的另外一个办法是使用特殊参数 “$0” ,它表示当前正在运行的 shell 或 shell 脚本的名称。这是 Bash 的一个特殊参数,但也可用在其他 shell 中,如 sh、zsh、tcsh 或 dash。使用 echo 命令可以查看你目前正在使用的 shell 的名称。
$ echo $0
bash
不要被一个叫做 $SHELL 的单独的环境变量所迷惑,它被设置为你的默认 shell 的完整路径。因此,这个变量并不一定指向你当前使用的 shell。例如,即使你在终端中调用不同的 shell,$SHELL 也保持不变。
$ echo $SHELL
/bin/shell
因此,找出当前的shell,你应该使用 $$ 或 $0,但不是 $SHELL。
找出当前 Shell 的版本
一旦你知道你使用的是哪个 shell,你可能想知道此 shell 的版本。为此,在命令行中输入 shell 并在后面加上 “--version” 参数可以查看版本信息。例如:
对于bashshell:
$ bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
对于zshshell:
$ zsh --version
zsh 5.0.7 (x86_64-pc-linux-gnu)
对于tcshshell: $ tcsh --version
tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,nd,color,filec
对于某些 shell,你还可以使用 shell 特定的变量(例如,$BASHVERSION 或 $ZSHVERSION)。
$ echo $BASH_VERSION
4.3.8(1)-release
摘自:http://m.toutiao.com/i6221626512869687810/?tt_from=android_share&iid=3283494589&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
其一,一个名为 "$$" 的特殊参数表示当前你正在运行的 shell 实例的 PID。此参数是只读的,不能被修改。所以,下面的命令也将显示你正在运行的 shell 的名字:
$ ps -p $$
PID TTY TIME CMD
21666 pts/4 00:00:00 bash
上述命令可在所有可用的 shell 中工作。
如果你不使用 csh,找到当前使用的 shell 的另外一个办法是使用特殊参数 “$0” ,它表示当前正在运行的 shell 或 shell 脚本的名称。这是 Bash 的一个特殊参数,但也可用在其他 shell 中,如 sh、zsh、tcsh 或 dash。使用 echo 命令可以查看你目前正在使用的 shell 的名称。
$ echo $0
bash
不要被一个叫做 $SHELL 的单独的环境变量所迷惑,它被设置为你的默认 shell 的完整路径。因此,这个变量并不一定指向你当前使用的 shell。例如,即使你在终端中调用不同的 shell,$SHELL 也保持不变。
$ echo $SHELL
/bin/shell
因此,找出当前的shell,你应该使用 $$ 或 $0,但不是 $SHELL。
找出当前 Shell 的版本
一旦你知道你使用的是哪个 shell,你可能想知道此 shell 的版本。为此,在命令行中输入 shell 并在后面加上 “--version” 参数可以查看版本信息。例如:
对于bashshell:
$ bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
对于zshshell:
$ zsh --version
zsh 5.0.7 (x86_64-pc-linux-gnu)
对于tcshshell: $ tcsh --version
tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,nd,color,filec
对于某些 shell,你还可以使用 shell 特定的变量(例如,$BASHVERSION 或 $ZSHVERSION)。
$ echo $BASH_VERSION
4.3.8(1)-release
摘自:http://m.toutiao.com/i6221626512869687810/?tt_from=android_share&iid=3283494589&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
背景:作者的服务器之前是Windows的后迁移到linux上,发现SQL查询的表在Linux上对大小写敏感,出现找不到该表,如何不改变服务器的表名称为对应的小写或代码改大写就能做到呢,改下my.cnf即可做到,如下摘录。
为什么在Windows能正常运行的程序和数据库,在Linux就会出现问题呢。这时一般会怀疑系统环境的问题,因为程序和数据库是一样的。
然而其实是英文字母大小写导致的结果。
比如在首页调取数据库数据的SQL文如下。
SELECT user_name,id from User;
User表在Windows系统上的Table名为user,因为不区别英文字母大小写所以没问题。
而在Linux会怎么样呢?
迁移过来的Table名是user,而在SQL文里指定的是User表。别忘了这家伙(Linux)区别英文字母大小写,因此会提示该表(User表)不存在。
解决方法
大概有3种解决方法,第一个是修改数据库的Table名,第二个是修改程序,第三个是修改MySQL的参数。
第一和第二,就无需多做说明了,而第三种方法是利用MySQL参数lower_case_table_names。
lower_case_table_names
参数lower_case_table_names是,在MySQL里怎么区别Table英文字母大小的,默认是0。
0:区别大小写1:不区别大小写(Table名以小写保存)2:不区别大小写(Table名以原来的大小写保存)
这样一来就简单了,可以让MySQL不区别Table名的大小写。在/etc/my.cnf(yum安装时的默认路径)文件的[mysqld]下面添加lower_case_table_names = 1就可以了。
[mysqld]
...
lower_case_table_names = 1
...
修改MySQL参数之后,重启一下数据库。
来自:http://m.toutiao.com/i6223691155964428802/?tt_from=android_share&iid=3283494589&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
为什么在Windows能正常运行的程序和数据库,在Linux就会出现问题呢。这时一般会怀疑系统环境的问题,因为程序和数据库是一样的。
然而其实是英文字母大小写导致的结果。
比如在首页调取数据库数据的SQL文如下。
SELECT user_name,id from User;
User表在Windows系统上的Table名为user,因为不区别英文字母大小写所以没问题。
而在Linux会怎么样呢?
迁移过来的Table名是user,而在SQL文里指定的是User表。别忘了这家伙(Linux)区别英文字母大小写,因此会提示该表(User表)不存在。
解决方法
大概有3种解决方法,第一个是修改数据库的Table名,第二个是修改程序,第三个是修改MySQL的参数。
第一和第二,就无需多做说明了,而第三种方法是利用MySQL参数lower_case_table_names。
lower_case_table_names
参数lower_case_table_names是,在MySQL里怎么区别Table英文字母大小的,默认是0。
0:区别大小写1:不区别大小写(Table名以小写保存)2:不区别大小写(Table名以原来的大小写保存)
这样一来就简单了,可以让MySQL不区别Table名的大小写。在/etc/my.cnf(yum安装时的默认路径)文件的[mysqld]下面添加lower_case_table_names = 1就可以了。
[mysqld]
...
lower_case_table_names = 1
...
修改MySQL参数之后,重启一下数据库。
来自:http://m.toutiao.com/i6223691155964428802/?tt_from=android_share&iid=3283494589&app=news_article&utm_medium=toutiao_android&utm_campaign=client_share
PHP7 now is GA,GA是啥意思?
Php/Js/Shell/Go jackxiang 2015-12-4 07:54
背景:说WordPress提升了229%,我怎么没有察觉到呢?不管怎么样,GA了。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎
GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的
其他的还有:
RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从
Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎
GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的
其他的还有:
RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从
Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.