mysql my.cnf 详解

Mysql my.ini 配置文件详解
#BEGIN CONFIG INFO
#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大
#TYPE: SYSTEM
#END CONFIG INFO
#
# 此mysql配置文件例子针对4G内存
# 主要使用INNODB
#处理复杂队列并且连接数量较少的mysql服务器
# 
# 将此文件复制到/etc/my.cnf 作为全局设置,
# mysql-data-dir/my.cnf 作为服务器指定设置
# (@localstatedir@ for this installation) 或者放入
# ~/.my.cnf 作为用户设置.
#
# 在此配置文件中, 你可以使用所有程序支持的长选项.
# 如果想获悉程序支持的所有选项
# 请在程序后加上"--help"参数运行程序.
#
# 关于独立选项更多的细节信息可以在手册内找到
#
#
# 以下选项会被MySQL客户端应用读取.
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容.
# 如果你想你自己的MySQL应用程序获取这些值
# 需要在MySQL客户端库初始化的时候指定这些选项
#
[client]
#password = [your_password]
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@
# *** 应用定制选项 ***
#
#  MySQL 服务端
#
[mysqld]
# 一般配置选项
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@
# back_log 是操作系统在监听队列中所能保持的连接数,
# 队列保存了在MySQL连接管理器线程处理之前的连接.
# 如果你有非常高的连接率并且出现"connection refused" 报错,
# 你就应该增加此处的值.
# 检查你的操作系统文档来获取这个变量的最大值.
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果
back_log = 50
# 不在TCP/IP端口上进行监听.
# 如果所有的进程都是在同一台服务器连接到本地的mysqld,
# 这样设置将是增强安全的方法
# 所有mysqld的连接都是通过Unix sockets 或者命名管道进行的.
# 注意在windows下如果没有打开命名管道选项而只是用此项
# (通过 "enable-named-pipe" 选项) 将会导致mysql服务没有任何作用!
#skip-networking
# MySQL 服务所允许的同时会话数的上限
# 其中一个连接将被SUPER权限保留作为管理员登录.
# 即便已经达到了连接数的上限.
max_connections = 100
# 每个客户端连接最大的错误允许数量,如果达到了此限制.
# 这个客户端将会被MySQL服务阻止直到执行了"FLUSH HOSTS" 或者服务重启
# 非法的密码以及其他在链接时的错误会增加此值.
# 查看 "Aborted_connects" 状态来获取全局计数器.
max_connect_errors = 10
# 所有线程所打开表的数量.
# 增加此值就增加了mysqld所需要的文件描述符的数量
# 这样你需要确认在[mysqld_safe]中 "open-files-limit" 变量设置打开文件数量允许至少4096
table_cache = 2048
# 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响
# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!) 
# 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表
#external-locking
# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)
# 每个连接独立的大小.大小动态增加
max_allowed_packet = 16M
# 在一个事务中binlog为了记录SQL状态所持有的cache大小
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能. 
# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中
# 如果事务比此值大, 会使用磁盘上的临时文件来替代. 
# 此缓冲在每个连接的事务第一次更新状态时被创建
binlog_cache_size = 1M
# 独立的内存表所允许的最大容量. 
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
max_heap_table_size = 64M
# 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序
# 如果排序后的数据无法放入排序缓冲, 
# 一个用来替代的基于磁盘的合并分类会被使用
# 查看 "Sort_merge_passes" 状态变量.
# 在排序发生时由每个线程分配
sort_buffer_size = 8M
# 此缓冲被使用来优化全联合(full JOINs 不带索引的联合). 
# 类似的联合在极大多数情况下有非常糟糕的性能表现,
# 但是将此值设大能够减轻性能影响.
# 通过 "Select_full_join" 状态变量查看全联合的数量
# 当全联合发生时,在每个线程中分配
join_buffer_size = 8M
# 我们在cache中保留多少线程用于重用
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,
# 则客户端线程被放入cache中. 
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)
thread_cache_size = 8
# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值
thread_concurrency = 8
# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果. 
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 查看 "Qcache_lowmem_prunes" 状态变量来检查是否当前值对于你的负载来说是否足够高.
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升.
query_cache_size = 64M
# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
query_cache_limit = 2M
# 被全文检索索引的最小的字长.
# 你也许希望减少它,如果你需要搜索更短字的时候.
# 注意在你修改此值之后,
# 你需要重建你的 FULLTEXT 索引
ft_min_word_len = 4
# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out
# 此选项对于性能有益
#memlock
# 当创建新表时作为默认使用的表类型,
# 如果在创建表示没有特别执行表类型,将会使用此值
default_table_type = MYISAM
# 线程使用的堆大小. 此容量的内存在每次连接时被预留.
# MySQL 本身常不会需要超过64K的内存
# 如果你使用你自己的需要大量堆的UDF函数
# 或者你的操作系统对于某些操作需要更多的堆,
# 你也许需要将其设置的更高一点.
thread_stack = 192K
# 设定默认的事务隔离级别.可用的级别如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和. 
tmp_table_size = 64M
# 打开二进制日志功能.
# 在复制(replication)配置中,作为MASTER主服务器必须打开此项
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.
log-bin=mysql-bin
# 如果你在使用链式从服务器结构的复制模式 (A->B->C), 
# 你需要在服务器B上打开此项. 
# 此选项打开在从线程上重做过的更新的日志,
# 并将其写入从服务器的二进制日志.
#log_slave_updates
# 打开全查询日志. 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询) 
# 都会被记录下来. 这对于调试非常有用, 在生产环境中常常关闭此项.
#log
# 将警告打印输出到错误log文件.  如果你对于MySQL有任何问题
# 你应该打开警告log并且仔细审查错误日志,查出可能的原因. 
#log_warnings
# 记录慢速查询. 慢速查询是指消耗了比 "long_query_time" 定义的更多时间的查询.
# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.
# 如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,
log_slow_queries
# 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.
# 不要在这里使用"1", 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).
long_query_time = 2
# 在慢速日志中记录更多的信息.
# 一般此项最好打开.
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里
log_long_format
# 此目录被MySQL用来保存临时文件.例如,
# 它被用来处理基于磁盘的大型排序,和内部排序一样.
# 以及简单的临时表.
# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好
# 另一种选择是你也可以将其放置在独立的磁盘上. 
# 你可以使用";"来放置多个路径
# 他们会按照roud-robin方法被轮询使用.
#tmpdir = /tmp
# ***  复制有关的设置
# 唯一的服务辨识号,数值位于 1 到 2^32-1之间. 
# 此值在master和slave上都需要设置.
# 如果 "master-host" 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id = 1
# 复制的Slave (去掉master段的注释来使其生效)
#
# 为了配置此主机作为复制的slave服务器,你可以选择两种方法:
#
# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -
#    语法如下:
#
#    CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
#    MASTER_USER=, MASTER_PASSWORD= ;
#
#    你需要替换掉 , ,  等被尖括号包围的字段以及使用master的端口号替换 (默认3306).
#
#    例子:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# 或者
#
# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,
#     例如如果你输入错密码在master-password字段并且slave无法连接), 
#    slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略
#    并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务.
#    由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替
#
# 所需要的唯一id号位于 2 和 2^32 - 1之间
# (并且和master不同)
# 如果master-host被设置了.则默认值是2
# 但是如果省略,则不会生效
#server-id = 2
#
# 复制结构中的master - 必须
#master-host = 
#
# 当连接到master上时slave所用来认证的用户名 - 必须
#master-user = 
#
# 当连接到master上时slave所用来认证的密码 - 必须
#master-password = 
#
# master监听的端口.
# 可选 - 默认是3306
#master-port = 
# 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据
#read_only
#*** MyISAM 相关选项
# 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.
# 不要将其设置大于你可用内存的30%, 
# 因为一部分内存同样被OS用来缓冲行数据 
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.
key_buffer_size = 32M
# 用来做MyISAM表全表扫描的缓冲大小.
# 当全表扫描需要时,在对应线程中分配.
read_buffer_size = 2M
# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道. 
# 如果你增高此值,可以提高很多ORDER BY的性能.
# 当需要时由每个线程分配
read_rnd_buffer_size = 16M
# MyISAM 使用特殊的类似树的cache来使得突发插入
# (这些插入是,INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., 以及 LOAD DATA
# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数. 
# 设置为 0 会关闭此优化.
# 为了最优化不要将此值设置大于 "key_buffer_size".
# 当突发插入被检测到时此缓冲将被分配.
bulk_insert_buffer_size = 64M
# 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.
# 这在每个线程中被分配.所以在设置大值时需要小心.
myisam_sort_buffer_size = 128M
# MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
myisam_max_sort_file_size = 10G
# 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.
# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.
myisam_max_extra_sort_file_size = 10G
# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
# 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.
myisam_repair_threads = 1
# 自动检查和修复没有适当关闭的 MyISAM 表.
myisam_recover
# 默认关闭 Federated 
skip-federated
# *** BDB 相关选项 ***
# 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.
skip-bdb
# *** INNODB 相关选项 ***
# 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,
# 使用此选项会节省内存以及磁盘空间,并且加速某些部分
#skip-innodb
# 附加的内存池被InnoDB用来保存 metadata 信息
# 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.
# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.
# SHOW INNODB STATUS 命令会显示当先使用的数量.
innodb_additional_mem_pool_size = 16M
# InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM. 
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. 
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,
# 所以不要设置的太高.
innodb_buffer_pool_size = 2G
# InnoDB 将数据保存在一个或者多个数据文件中成为表空间.
# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.
# 其他情况下.每个设备一个文件一般都是个好的选择.
# 你也可以配置InnoDB来使用裸盘分区 - 请参考手册来获取更多相关内容
innodb_data_file_path = ibdata1:10M:autoextend
# 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.
# 默认保存在MySQL的datadir中.
#innodb_data_home_dir = 
# 用来同步IO操作的IO线程的数量. This value is
# 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.
innodb_file_io_threads = 4
# 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.
# 从1开始并且增加此值知道你能够成功的导出表.
#innodb_force_recovery=1
# 在InnoDb核心内的允许线程数量. 
# 最优值依赖于应用程序,硬件以及操作系统的调度方式. 
# 过高的值可能导致线程的互斥颠簸.
innodb_thread_concurrency = 16
# 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,
# 这提供了完整的ACID行为.
# 如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O
# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘. 
# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
innodb_flush_log_at_trx_commit = 1
# 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.
# 这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.
#innodb_fast_shutdown
# 用来缓冲日志数据的缓冲区的大小.
# 当此值快满时, InnoDB将必须刷新数据到磁盘上.
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_buffer_size = 8M
# 在日志组中每个日志文件的大小.
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.
innodb_log_file_size = 256M
# 在日志组中的文件总数.
# 通常来说2~3是比较好的.
innodb_log_files_in_group = 3
# InnoDB的日志文件所在位置. 默认是MySQL的datadir.
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能
#innodb_log_group_home_dir
# 在InnoDB缓冲池中最大允许的脏页面的比例.
# 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.
# 这是一个软限制,不被保证绝对执行.
innodb_max_dirty_pages_pct = 90
# InnoDB用来刷新日志的方法.
# 表空间总是使用双重写入刷新方法
# 默认值是 "fdatasync", 另一个是 "O_DSYNC".
#innodb_flush_method=O_DSYNC
# 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.
# InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎
# 那么一个死锁可能发生而InnoDB无法注意到.
# 这种情况下这个timeout值对于解决这种问题就非常有帮助.
innodb_lock_wait_timeout = 120
[mysqldump]
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# 仅仅允许使用键值的 UPDATEs 和 DELETEs .
#safe-updates
[isamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
# 增加每个进程的可打开文件数量.
# 警告: 确认你已经将全系统限制设定的足够高! 
# 打开大量表需要将此值设高
open-files-limit = 8192

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/106704/showart_2124313.html

psyco 真的很神奇

测试代码
http://www.timestretch.com/FractalBenchmark.html#e7142f2f73f8eb4245f1b25aa6340470

没有使用 psyco 3.4 左右,生成 pyc 3.14 ,用了 psyco 0.34
真是太强大了,

freebsd 安装 psyco

cd /usr/ports/devel/py-psyco
make install clean

开启

import psyco
psyco.full()

VBoxManage命令详解

VBoxManage命令详解
本人对vboxmange命令按我个人的理解作了解释,由于本人水平有限难免有错误的地方,希望大家帮我指正。

VBoxManage [-v|-version] 显示virtualbox的版本号
VBoxManage -nologo 隐藏logo
VBoxManage -convertSettings 允许自动转换设置文件
VBoxManage -convertSettingsBackup 允许自动转换设置文件,并在转换前作备份
VBoxManage -convertSettingsIgnore 允许自动转换设置文件,但是不保存结果

VBoxManage list vms|runningvms 显示列表虚拟机|正在运行的虚拟机
|ostypes|hostdvds virtualbox支持的系统类型|宿主机的光盘驱动器
|hostfloppies 宿主机的软盘驱动器
|hostifs|hostinfo 宿主机的网络接口|宿主机的信息
|hdds|dvds 已注册的虚拟硬盘|已注册的虚拟光盘
|floppies|usbhost 已注册的虚拟软盘|宿主机的USB设备
|usbfilters USB筛选器
|systemproperties 虚拟机的基本信息

VBoxManage showvminfo | 显示指定虚拟机的信息
[-details] 显示详细信息
[-statistics] 显示统计信息
[-machinereadable] 以清晰的格式显示虚拟机信息

VBoxManage registervm 将指定文件所在的虚拟机添加到列表

VBoxManage unregistervm | 从虚拟机列表清除指定的虚拟机
[-delete] 从虚拟机列表删除指定的虚拟机

VBoxManage createvm -name 创建指定名称的虚拟机
[-register] 将创建的虚拟机添加到列表
[-basefolder 指定虚拟机的基础目录
[-settingsfile ] 指定虚拟机配置文件的基础目录
[-uuid ] 创建指定uuid的虚拟机

VBoxManage modifyvm 编辑指定的虚拟机的配置
[-name ] 修改虚拟机的名称
[-ostype ]修改虚拟机的操作系统类型
[-memory ] 修改虚拟机的内存大小
[-vram ] 修改虚拟机的显存大小
[-acpi on|off] 启动或禁止acpi电源管理接口
[-ioapic on|off] 启动或禁止I/O APIC电源管理接口
[-pae on|off] 启动或禁止CPU的PAE支持,PAE是
Physical Address Extension : 物理地址扩展
[-hwvirtex on|off|default]启动或禁止CPU的硬件虚拟化支持
[-nestedpaging on|off] 开启或关闭CPU的嵌套页面列表支持
[-monitorcount ] 设置显示器数目,VRDP多用户模式时 [-bioslogofadein on|off] 开启或关闭bioslogo渐显效果
[-bioslogofadeout on|off] 开启或关闭bioslogo渐隐效果
[-bioslogodisplaytime ]设置bioslogo显示时间(以毫秒为单位)
[-bioslogoimagepath ]设置bioslogo图像路径,用于自定义bioslogo
[-biosbootmenu disabled| 设置是否显示bios启动菜单 关闭
menuonly| 只菜单
messageandmenu] 信息和菜单
[-biossystemtimeoffset ] 设置bios系统时间补偿(以毫秒为单位)
[-biospxedebug on|off] 打开或关闭biospxe调试
[-boot<1-4> none|floppy|dvd|disk|net>] 设置启动顺序
[-hd none||] 为虚拟机添加三个IDE设备之一(第2个主盘被vm保留作为光驱,不能占用)在三个IDE中,你可以指定(硬盘)的vdi文件名或者它的UUID
[-idecontroller PIIX3|PIIX4] 设置IDE控制器的类型
[-sata on|off] 开启或关闭SATA硬盘控制器
[-sataportcount <1-30>] 设置虚拟机最多支持的SATA控制器数目
[-sataport<1-30> none| 没有硬盘连接到SATA控制器
| 指定uuid的硬盘连接到SATA控制器
] 指定文件名的硬盘连接到SATA控制器
[-sataideemulation<1-4> <1-30>] 指定一个SATA设备工作在IDE兼容模式,IDE设备编号是1-4,SATA设备编号是1-30
[-dvd none| 不连接DVD光驱
| 指定UUID的DVD光驱连接
| 将指定的光盘映像文件挂接到DVD光驱
host:] 将宿主机的DVD光驱挂接到虚拟机的DVD光驱
[-dvdpassthrough on|off]打开|关闭虚拟机里光盘的刻录功能
[-floppy disabled| 不连接软驱
empty| 连接软驱但不插入软盘
| 指定UUID的软驱连接
| 将指定的软盘映像文件挂接到软驱驱
host:] 将宿主机的软驱驱挂接到虚拟机的软驱
[-nic<1-N> none| 虚拟机不添加网卡
null| 虚拟机有网卡但不连接
nat| 网络连接使用NAT模式
hostif| 网络连接使用桥接模式
intnet] 网络连接使用内部网络模式
[-nictype<1-N> Am79C970A| 虚拟机连接AMD PCNet PCI II网卡
Am79C973| 虚拟机连接AMD PCNet FAST III网卡(默认)
82540EM| 虚拟机连接Intel PRO/1000 MT Desktop网卡
82543GC] 虚拟机连接Intel PRO/1000 T Server网卡
[-cableconnected<1-N> on|off]插入或拔出网线
[-nictrace<1-N> on|off] 开启或关闭网络追踪
[-nictracefile<1-N> ] 将网络流量追踪数据保存到文件
[-nicspeed<1-N> ] 设置网络连接的速度
[-hostifdev<1-N> none| 不连接到主机网络接口
] 桥接模式下连接到指定的主机接口
[-intnet<1-N> ] 内网模式下为虚拟机指定内部网络名称
[-natnet<1-N> | 配置NAT网络接口的地址
default] 默认NAT网络接口的地址是10.0.x.0/24
[-macaddress<1-N> auto| 自动生成虚拟网卡的MAC地址
] 指定虚拟网卡的MAC地址
[-uart<1-N> off| 不启用虚拟串口
]启用虚拟串口,并设置虚拟串口的I/O参数和IRQ参数
[-uartmode<1-N> disconnected| 启用虚拟串口,但不连接到宿主机的串口
server | 在宿主机创建PIPE通道,并将虚拟机串口连接到这个通道
client | 不创建PIPE通道,而是将虚拟机串口连接到已存在的通道
] 将虚拟机串口连接到宿主机的串口
[-gueststatisticsinterval ] 配置虚拟机静态时间间隔
[-audio none| 虚拟机不连接声卡
null| 将虚拟机的声卡连接到空的声音设备
dsound] 将虚拟机的声卡连接到宿主机的声卡
[-audiocontroller ac97| 将虚拟机声卡虚拟为ICH AC97声卡
sb16] 将虚拟机声卡虚拟为soundblaster 16声卡
[-clipboard disabled| 不共享剪贴板
hosttoguest| 将宿主机的剪贴板共享给虚拟机
guesttohost| 将虚拟机的剪贴板共享给宿主机
bidirectional] 宿主机和虚拟机共使用一个剪贴板
[-vrdp on|off] 开启|关闭virtualbox内置的VRDP服务器
[-vrdpport default| 使用默认的vrdp端口3389 ] 指定vrdp端口
[-vrdpaddress ] 指定VRDP主机地址
[-vrdpauthtype null| 不用授权,任何客户机都可以连接到VRDP服务器
external| 只有宿主机的用户才可以连接到VRDP服务器
guest] 只有虚拟机的用户才可以连接到VRDP服务器
[-vrdpmulticon on|off] 打开|关闭VRDP多用户连接模式
[-vrdpreusecon on|off] 打开|关闭VRDP断线重连
[-usb on|off] 打开|关闭虚拟USB控制器
[-usbehci on|off] 打开|关闭虚拟USB2.0控制器
[-snapshotfolder default| 将系统快照保存到默认文件夹 ] 将系统快照保存到指定文件夹

VBoxManage startvm | 开启指定UUID|名称的虚拟机
[-type gui|vrdp] 设置虚拟机标准显示设备GUI界面|VRDP

VBoxManage controlvm | 改变正在运行的虚拟机的状态
pause| 暂停,这时虚拟机窗口显示灰色
resume| 恢复暂停的虚拟机
reset| 复位
poweroff| 强行关闭
acpipowerbutton| 关机
acpisleepbutton| 使虚拟机处于睡眠状态
savestate| 保存状态然后关闭,相当于休眠
keyboardputscancode [ …] 键盘扫描码设置
setlinkstate<1-4> on|off 连接|断开网络连接
usbattach |

连接到指定UUDI|地址的USB设备
usbdetach |
断开指定UUDI|地址的USB设备
dvdattach none| 不连接虚拟DVD光驱
| 连接到指定UUID的DVD光驱
| 连接到指定名称的DVD映像文件
host: 连接到宿主机的DVD光驱
floppyattach none| 不连接虚拟软驱
| 连接到指定UUID的虚拟软驱
| 连接到指定名称的软盘映像文件
host: 连接到宿主机的软驱

setvideomodehint 设置虚拟机的屏幕分辨率 水平像素
垂直像素
颜色深度
[display] 刷新频率
setcredentials 指定VRDP自动连接参数 用户名 密码

[-allowlocallogon ] 允许|禁止本地登陆

VBoxManage discardstate | 丢弃指定UUID|名称的虚拟机的保存状态

VBoxManage adoptstate | 将虚拟机从指定的保存状态中恢复

VBoxManage snapshot | 为指定的虚拟机拍快照
take 为快照取名
[-desc ]| 给快照添加描述
discard | | 丢弃指定的快照
discardcurrent -state| 恢复到最近的快照
-all | 恢复到倒数第二个快照
edit || 编辑指定的快照
-current 编辑当前快照
[-newname ] 修改快照名称
[-newdesc ] 修改快照描述
showvminfo | 显示快照的虚拟机信息

VBoxManage registerimage disk|dvd|floppy 注册硬盘、光盘、软盘映像文件
[-type normal| 注册为普通类型(可创建快照,可读写)
immutable| 注册为只读类型(相当于加了硬盘卡)
writethrough] 注册为可写类型(这种类型不能创建快照)
(disk only) (注册类型选项只适用于硬盘)

VBoxManage unregisterimage disk| 从虚拟介质管理器删除指定的硬盘
dvd| 从虚拟介质管理器删除指定的DVD光盘
floppy 从虚拟介质管理器删除指定的软盘
| 删除时指定UUID
删除时指定映像文件

VBoxManage showvdiinfo | 显示指定UUID|名称虚拟硬盘的信息

VBoxManage createvdi -filename 创建指定名称的虚拟硬盘
-size 指定虚拟硬盘的大小(以兆为单位)
[-static] 创建固定大小的虚拟硬盘
[-comment ] 添加一段解释性文字
[-register] 注册新创建的虚拟硬盘
[-type normal| 注册类型 普通(可以创建快照)
writethrough] 注册类型 可写(不能创建快照)
(default: normal) 默认是普通类型
VBoxManage modifyvdi | compact 压缩指定的虚拟硬盘

VBoxManage clonevdi | 克隆指定的VDI虚拟硬盘

VBoxManage convertdd [-static] 将raw硬盘转换成vdi虚拟硬盘
VBoxManage convertdd [-static] stdin 将标准输入参数指定的设备转换成vdi虚拟硬盘,比如:dd if=/dev/sda1 | VBoxManage convertdd
=======================================================================
VBoxManage addiscsidisk -server | 通过指定服务器名称|ip地址添加ISCSI硬盘
-target 指定对象名称字符串
[-port ] 指定ISCSI对象的服务端口号
[-lun ] 指定对象资源的逻辑单元编号
[-encodedlun ] 指定另一种格式的对象资源的逻辑单元编号
[-username ] 指定连接ISCSI对象的用户名
[-password ] 指定连接ISCSI对象所需的密码
[-comment ] 为这个连接添加一段描述性文字
比如:VBoxManage addiscsidisk -server 10.200.2.30 -target iqn.2000-12.com.acme:storage.lun0 -lun 0

VBoxManage createhostif 在宿主机添加一个指定名称的虚拟网络接口
VBoxManage removehostif | 从宿主机删除指定UUID|名称的虚拟网络接口

VBoxManage getextradata global| 获取全局设置信息
| 获取指定UUID的虚拟机的信息
获取指定名称的虚拟机的信息
| 获取与指定键值相关联的数据信息
enumerate 列举信息
比如:VBoxManage getextradata xp installdate 用于获取虚拟机XP的安装时间

VBoxManage setextradata global| 设置全局信息
| 设置指定UUID的虚拟机的信息
设置指定名称的虚拟机的信息
指定要添加信息的键
[] 给上面的键添加键值(必须指定键值)
比如:VBoxManage setextradata xp installdate 2006.01.01 设置虚拟机xp的安装时间为2006年1月1日

VBoxManage setproperty vdifolder default| 在全局设定里设置vdi目录为默认
| 在全局设定里设置指定vdi目录
machinefolder default| 在全局设定里设置虚拟机目录为默认
| 在全局设定里指定虚拟机目录
vrdpauthlibrary default| 在全局设定里设置VRDP证书为默认的证书 | 在全局设定里指定其他的VRDP证书
websrvauthlibrary default| 在全局设定里设置Web服务证书为默认的证书
null| 在全局设定里设置web服务证书为空 | 在全局设定里指定其他的Web服务证书
hwvirtexenabled yes|no 在全局设定里设置是|否支持硬件虚拟化
loghistorycount 在全局设定里设置日志数目,编号从0开始

VBoxManage usbfilter add 添加usb筛选器并设置它在筛选器列表中的位置
-target | 添加usb筛选器到指定UUID的虚拟机
| 添加usb筛选器到指定名称的虚拟机
global 添加全局usb筛选器
-name 给usb筛选器指定名称
-action ignore| 不允许虚拟机连接到筛选器
hold 允许虚拟机连接到筛选器(全局筛选器时)
[-active yes|no] 筛选器是|否生效(默认是生效)
[-vendorid ] 给usb筛选器指定vendorid(厂商标志)
[-productid ] 给usb筛选器指定productid(产品标志号)
[-revision ] 给usb筛选器指定revision(修订版本号)
[-manufacturer ] 给usb筛选器指定manufacturer(制造商)
[-product ] 给usb筛选器指定product(产品标志)
[-remote yes|no] 指定usb筛选器是|否在远程登陆时有效
[-serialnumber ] 给usb筛选器指定serialnumber(序列号)
[-maskedinterfaces ]
VBoxManage usbfilter modify 修改usb筛选器在列表中的顺序
-target | 修改指定UUID的虚拟机的usb筛选器
| 修改指定名称的虚拟机的usb筛选器
global 修改全局设置的usb筛选器
[-name ] 修改筛选器名称
[-action ignore| 不允许虚拟机连接到筛选器
hold] 允许虚拟机连接到筛选器(全局筛选器时)
[-active yes|no] 筛选器是|否生效(默认是生效)
[-vendorid |””] 给usb筛选器指定vendorid(厂商标志)
[-productid |””] 给usb筛选器指定productid(产品标志号)
[-revision |””] 给usb筛选器指定revision(修订版本号)
[-manufacturer |””] 给usb筛选器指定manufacturer(制造商)
[-product |””] 给usb筛选器指定product(产品标志)
[-remote yes|no] 指定usb筛选器是|否在远程登陆时有效
[-serialnumber |””] 给usb筛选器指定serialnumber(序列号)
[-maskedinterfaces |””]

VBoxManage usbfilter remove 删除指定序号的usb筛选器
-target | 删除指定UUID的虚拟机的usb筛选器
| 删除指定名称的虚拟机的usb筛选器
global 删除全局usb筛选器

VBoxManage sharedfolder add | 添加共享文件夹到指定名称的虚拟机
添加共享文件夹到指定uuid的虚拟机
-name 指定共享文件夹名称
-hostpath 指定共享文件夹所在的主机路径
[-transient] 设置临时共享
[-readonly] 设置共享为只读

VBoxManage sharedfolder remove | 从指定名称的虚拟机删除共享文件夹
从指定UUID的虚拟机删除共享文件夹
-name 删除指定名称的共享文件夹
[-transient] 临时删除

VBoxManage vmstatistics | 统计指定名称的虚拟机的运行状态信息
统计指定UUID的虚拟机的运行状态信息
[-reset] 复位统计信息
[-pattern ] 设置信息的显示格式
[-descriptions] 在统计信息中显示描述信息

VBoxManage guestproperty get | 获取指定名称的虚拟机的预先设定的属性值
获取指定UUID的虚拟机的预先设定的属性值 获取指定属性的预先设定的值
[-verbose] 以冗长的格式显示

VBoxManage guestproperty set | 给指定名称的虚拟机设置属性值
给指定UUID的虚拟机设置属性值 要设定值的属性
[ 给属性设定的值
[-flags ]] 设置一个标志

VBoxManage guestproperty enumerate | 列举指定名称的虚拟机的属性值
列举指定UUID的虚拟机的属性值
[-patterns ] 列举属性值时采用的格式
VBoxManage metrics list [*| 显示性能计数器
收集的所有系统资源的监测数据
host| 显示性能计数器
收集的宿主机的系统资源的监测数据
显示性能计数器
收集的虚拟机的系统资源的监测数据
[]] 要显示的性能计数器列表

VBoxManage metrics setup 设置性能计数器
[-period ] 设置性能计数器的显示周期
[-samples ] 设置性能计数器抽样统计数
[*| 对所有资源设置设置性能计数器
host| 对宿主机资源设置设置性能计数器
对虚拟机资源设置设置性能计数器
[]] 性能计数器列表
例如:VBoxManage metrics setup -period 1 -samples 5 host CPU/Load,RAM/Usage

VBoxManage metrics query [*| 查找并显示所有资源当前的性能计数器
host| 查找并显示宿主机当前的资源的性能计数器
查找并显示虚拟机当前的资源的性能计数器
[]] 性能计数器列表
例如:VBoxManage query host CPU/Load/User,CPU/Load/Kernel

VBoxManage metrics collect 收集性能计数器信息
[-period ] 设置性能计数器信息显示的刷新周期
[-samples ] 设置性能计数器抽样统计数
[-list] 显示当前可以收集信息的性能计数器
&

要从命令行创建虚拟机,你可以执行以下三步,我们以 Ubuntu 9.10 为例:

1.

创建一个新的虚拟机,虚拟机的名称通过 –name 选项指定:

VBoxManage createvm –name “Ubuntu 9.10” –register
2.

创建该虚拟机所用的虚拟硬盘,用 –filename 指定虚拟硬盘的名称,–size 选项指定虚拟硬盘的大小,本例为 5 GB:

VBoxManage createhd –filename “Ubuntu910.vdi” –size 5000 –remember
3.

修改虚拟机的选项设置:

VBoxManage modifyvm “Ubuntu 9.10” –memory “512MB” –hda “Ubuntu910.vdi” –dvd /home/linuxtoy/karmic-desktop-i386.iso –acpi on –accelerate3d on –boot1 dvd –nic1 nat

其中,

* –memory 指定内存的大小
* –hda 指定所用的虚拟硬盘
* –dvd 指定所用的 ISO 映像
* –acpi on 启用 ACPI
* –accelerate3d on 启用 3D 加速
* –boot1 引导次序
* –nic1 网络设置

如果你愿意,那么现在便可以通过 VBoxManage startvm “Ubuntu 9.10” 来启动虚拟机。

http://zhang-ly520.javaeye.com/blog/300606
http://www.svn8.com/linux/glpz/20090915/9470.html

php tokyo_tyrant扩展安装

tokyo_tyrant 还是beta 版,freebsd 的 ports 还没有,有点不爽,用 pecl 安装吧,

pecl install tokyo_tyrant

pecl: Command not found.

先安装 pear 呵呵

cd /usr/ports/devel/pear
make install clean
pecl install tokyo_tyrant
Failed to download pecl/tokyo_tyrant within preferred state "stable", latest release is version 0.1.2, stability "beta", use "channel://pecl.php.net/tokyo_tyrant-0.1.2" to install
install failed

还是不行,要加入beta 才行哦

pecl install tokyo_tyrant-beta
ee /usr/local/etc/php/extensions.ini
加入 
extension=tokyo_tyrant.so

OK 安装完成 重起php进程,用phpinfo 查看一下 freebsd 真是太强大了,喜欢哦!

memcachedb

memcachedb是为了持久化而产生的一个分布式 “key-value”存储系统,你可以认为是memcached+berkeley DB+sina的一些东西的一个集成,这个东西主要是为了提高持久化对象的访问效率,而不是一个缓存,他的特点是:

比传统的RDBMS速度快效率高
高并发环境下访问安全可靠,效率很不错
存储的数据比较小

总之:高效、安全的事物机制、memcached的分布式协议支持
是他的几大亮点.

你可以将一些数据量不大,读写却很频繁的数据放再这里面,而不用往mysql等数据库里写,据说“sohu”的在线用户是存在这里面的,可见这东西还是挺可靠的。
在官方文档里明确指出,只提倡用此数据库保存如下类型的数据:
Index, Counter, Flags
Identity Management(Account, Profile, User config info, Score)
Messaging
Personal domain name
meta data of distributed system
Other non-relatonal data
…………………..

即,要求访问数据快、数据量不大,并且需要持久化到数据库中,却不需要sql查询的数据.

下面我们来说应用:
如果你看过了上一片文章,并且已经成功安装memcachedb的话,那么,现在请启动你的memcachedb,命令如下:
memcachedb -p21201 -d -r -u root -f 21201.db -H /data1/demo -N -P /data1/logs/21201.pid
参数说明如下:

‘-p ’ TCP port number to listen on (default: 21201) tcp侦听端口

‘-l ’ interface to listen on, default is INDRR ANY 这个不要管他

‘-d’ run as a daemon 作为隐藏的线程运行

‘-r’ maximize core file limit
‘-u ’ assume identity of (only when run as root) 用户名

‘-c ’ max simultaneous connections, default is 1024
‘-b ’ max item buffer size in bytes, default is 1KB
‘-v’ verbose (print errors/warnings while in event loop)
‘-vv’ very verbose (also print client commands/reponses)
‘-P ’ save PID in , only used with -d option

‘-m ’ in-memmory cache size of BerkeleyDB in megabytes, default
is 64MB
‘-f ’ filename of database, default is
/data1/memcachedb/default.db
‘-H

’ env home of database, default is /data1/memcachedb
‘-L ’ log buffer size in kbytes, default is 32KB
‘-C ’ do checkpoint every XX seconds, 0 for disable, default is 60s
‘-D ’ do deadlock detecting every XXX millisecond, 0 for disable,
default is 100ms
‘-N’ enable DB TXN NOSYNC to gain big performance
improved, default is off

如果你想要将数据保存再特定的目录可以使用-H 但是你必须首先要创建该目录,否则数据库将不可启动
现在我们来测试下memcachedb是否已经启动了:
输入 telnet ‘your ip’ 端口号 (默认21201)
telnet 127.0.0.1 21201
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ’^]’.
如果可以连接,证明已经启动,现在我们可以来联系下memcached的命令了,呵呵.

以下是memcachedb支持的命令:
‘get’ Retrieval of one or multiple items
‘set’ ”Store this data”
‘add’ ”Store this data, but only if the server *doesn’t* already
hold data for this key”
‘replace’ ”Store this data, but only if the server *does* already hold
data for this key”
‘delete’ deletes one item based a key
‘incr/decr’ Increment or decrement a numeric value. It’s atomic!
‘stats’ shows the status of current deamon. ’stats’, ’stats malloc’,
’stats maps’
Steve

‘db checkpoint’ does a checkpoint manuanlly.
‘db archive’ removes log files that are no longer needed.
‘stats bdb’ shows the status of BerkeleyDB.
‘rep ismaster’ shows whether the site is a master.
‘rep whoismaster’ shows which site is a master.
‘rep set priority’ sets the priority of a site for electing in replication.
‘rep set ack policy’ sets ACK policy of the replication.
‘rep set ack timeout’ sets ACK timeout value of the replication .
‘rep set bulk’ Enable bulk transfer or not in replication.
‘rep set request’ sets the minimum and maximum number of missing
log records that a client waits before requesting
retransmission.
‘stats rep’ shows the status of Replication.

by http://www.cnblogs.com/eoiioe/archive/2008/11/11/1331242.html

freebsd下python程序打包工具 ── cx_Freeze

cx_Freeze是一个类似py2exe的工具,它们区别是py2exe是将python程序打包成windows下可以执行的exe文件的,而cx_Freeze则是将python程序打包为linux下可以直接执行的ELF格式的二进制可执行文件(看说明好像也能生成windows的可执行文件,号称跨平台)。
cx_Freeze的作用就是让你的python程序可以脱离python运行环境,在没有安装python的微型linux系统(例如cdlinux、tinycore等)里,方便地运行你的python程序。从功能上来说,也可以将其理解为一个python程序的编译器,将你的源码隐藏起来。

安装

cd /usr/ports/devel/cx_Freeze
make install clean

打包程序

cxfreeze 你的程序文件.py --target-dir dist

进程信号

转载:http://blog.csdn.net/ljx0305/archive/2008/09/09/2904056.aspx

SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时

1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控
制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端
不再关联.
2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出
3) SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到
SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信
号.
4) SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行
数据段. 堆栈溢出时也有可能产生这个信号.
5) SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用.
6) SIGABRT 程序自己发现错误并调用abort时产生.
6) SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.
7) SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长
的整数, 但其地址不是4的倍数.
8) SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢
出及除数为0等其它所有的算术的错误.
9) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.
10) SIGUSR1 留给用户使用
11) SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.
12) SIGUSR2 留给用户使用
13) SIGPIPE Broken pipe
14) SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该
信号.
15) SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和
处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这
个信号.
17) SIGCHLD 子进程结束时, 父进程会收到这个信号.
18) SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用
一个handler来让程序在由stopped状态变为继续执行时完成特定的
工作. 例如, 重新显示提示符
19) SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:
该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.
20) SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时
(通常是Ctrl-Z)发出这个信号
21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN
信号. 缺省时这些进程会停止执行.
22) SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.
23) SIGURG 有”紧急”数据或out-of-band数据到达socket时产生.
24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/
改变
25) SIGXFSZ 超过文件大小资源限制.
26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.
27) SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的
时间.
28) SIGWINCH 窗口大小改变时发出.
29) SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.
30) SIGPWR Power failure

有两个信号可以停止进程:SIGTERM和SIGKILL。 SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

用Python写简单守护进程【转】

[转载自]http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

I’ve written a simple Python class for creating daemons on unix/linux systems. It was pieced together for various other examples, mostly corrections to various Python Cookbook articles and a couple of examples posted to the Python mailing lists. It has support for a pidfile to keep track of the process. I hope it’s useful to someone.

Below is the Daemon class. To use it, simply subclass it and implement the run() method. Download this file.

#!/usr/bin/env python

import sys, os, time, atexit
from signal import SIGTERM 

class Daemon:
    """
    A generic daemon class.
    
    Usage: subclass the Daemon class and override the run() method
    """
    def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
        self.stdin = stdin
        self.stdout = stdout
        self.stderr = stderr
        self.pidfile = pidfile
    
    def daemonize(self):
        """
        do the UNIX double-fork magic, see Stevens' "Advanced 
        Programming in the UNIX Environment" for details (ISBN 0201563177)
        http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
        """
        try: 
            pid = os.fork() 
            if pid > 0:
                # exit first parent
                sys.exit(0) 
        except OSError, e: 
            sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
            sys.exit(1)
    
        # decouple from parent environment
        os.chdir("/") 
        os.setsid() 
        os.umask(0) 
    
        # do second fork
        try: 
            pid = os.fork() 
            if pid > 0:
                # exit from second parent
                sys.exit(0) 
        except OSError, e: 
            sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
            sys.exit(1) 
    
        # redirect standard file descriptors
        sys.stdout.flush()
        sys.stderr.flush()
        si = file(self.stdin, 'r')
        so = file(self.stdout, 'a+')
        se = file(self.stderr, 'a+', 0)
        os.dup2(si.fileno(), sys.stdin.fileno())
        os.dup2(so.fileno(), sys.stdout.fileno())
        os.dup2(se.fileno(), sys.stderr.fileno())
    
        # write pidfile
        atexit.register(self.delpid)
        pid = str(os.getpid())
        file(self.pidfile,'w+').write("%s\n" % pid)
    
    def delpid(self):
        os.remove(self.pidfile)

    def start(self):
        """
        Start the daemon
        """
        # Check for a pidfile to see if the daemon already runs
        try:
            pf = file(self.pidfile,'r')
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None
    
        if pid:
            message = "pidfile %s already exist. Daemon already running?\n"
            sys.stderr.write(message % self.pidfile)
            sys.exit(1)
        
        # Start the daemon
        self.daemonize()
        self.run()

    def stop(self):
        """
        Stop the daemon
        """
        # Get the pid from the pidfile
        try:
            pf = file(self.pidfile,'r')
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None
    
        if not pid:
            message = "pidfile %s does not exist. Daemon not running?\n"
            sys.stderr.write(message % self.pidfile)
            return # not an error in a restart

        # Try killing the daemon process    
        try:
            while 1:
                os.kill(pid, SIGTERM)
                time.sleep(0.1)
        except OSError, err:
            err = str(err)
            if err.find("No such process") > 0:
                if os.path.exists(self.pidfile):
                    os.remove(self.pidfile)
            else:
                print str(err)
                sys.exit(1)

    def restart(self):
        """
        Restart the daemon
        """
        self.stop()
        self.start()

    def run(self):
        """
        You should override this method when you subclass Daemon. It will be called after the process has been
        daemonized by start() or restart().
        """

And here is an example implementation. It implements the daemon as well as it’s controlling client. Simply invoke this script with start, stop or restart as it’s first argument. Download this file.

#!/usr/bin/env python

import sys, time
from daemon import Daemon

class MyDaemon(Daemon):
    def run(self):
        while True:
            time.sleep(1)

if __name__ == "__main__":
    daemon = MyDaemon('/tmp/daemon-example.pid')
    if len(sys.argv) == 2:
        if 'start' == sys.argv[1]:
            daemon.start()
        elif 'stop' == sys.argv[1]:
            daemon.stop()
        elif 'restart' == sys.argv[1]:
            daemon.restart()
        else:
            print "Unknown command"
            sys.exit(2)
        sys.exit(0)
    else:
        print "usage: %s start|stop|restart" % sys.argv[0]
        sys.exit(2)

Django and Memcached

just ran into several problems while setting up memcached for a django installation, that is replicated over several servers. One of the problems was the compiling of cmemcache, a python extension for libmemcache, where I received the following error:

‘CmemcacheObject’ has no member named ‘mc_ctxt’

First I didn’t realized the additional file, that resides at the file list of downloadable cmemcache versions. With this file you can patch the libmemcache library so cmemcache can be build. Here the steps to compile and install cmemcache:

cd ~
wget http://people.freebsd.org/~seanc/libmemcache/libmemcache-1.4.0.rc2.tar.bz2
wget http://gijsbert.org/downloads/cmemcache/libmemcache-1.4.0.rc2.patch
wget http://gijsbert.org/downloads/cmemcache/cmemcache-0.95.tar.bz2
# the patch was made using a folder called reference
mkdir reference
cd reference
tar xjvf ../libmemcache-1.4.0.rc2.tar.bz2
cd ..
patch -p0 < libmemcache-1.4.0.rc2.patch cd reference/libmemcache-1.4.0.rc2 ./configure && make sudo make install cd ../../ tar xjvf cmemcache-0.95.tar.bz2 cd cmemcache-0.95 ./configure && make sudo make install After doing these steps you should be able to do this in your python console: import cmemcache Instead of the cmemcache library you can also install python-memcache, that is a memcache library completely written in python. But the cmemcache is definitely faster and if you have installed both libraries, django will favor the c implementation in front of the python one. The other problem with memcached and django relies on a misunderstanding of mine. I thought, that if I define several memcached instances in my CACHE_BACKEND setting of django, it sends every new or changed key/value pair to each server in the list and holds each one redundant on all memcached instances. So I’ve defined the following CACHE_BACKEND setting on Django Server A (192.168.1.1): CACHE_BACKEND = 'memcached://192.168.1.1:11211;192.168.1.2:11211/' and on Django Server B (192.168.1.2): CACHE_BACKEND = 'memcached://192.168.1.2:11211;192.168.1.1:11211/' and assumed, when a request on the cache was made, that Django Server B would first try to access the memcache instance on Server B. This assumption was totally wrong and on top of that I also recognized, that no saved cache-entry from Django Server A was available on Django Server B. So I’ve started to read the documentation of memcached and came across the following faq entry. There you can read, how memcached is working and how values are saved across several instances: When doing a memcached lookup, first the client hashes the key against the whole list of servers A result of this is, that the setting of CACHE_BACKEND for memcached servers must be the same on all django installations. Otherwise the hash for a key/value pair would be a different one on each server and you are not able to access cached values across the installations. Another result is, that a cascade of memcached servers act as one big cache server with the main goal to scale large. You never know on which of the memached servers your cached value is saved. Additional note! If you are running memcached instances on servers that are far distant from each other (like a server in Germany and one in the US), you shouldn’t use several memcached instances as one cluster. Replicate your memcached instances with the modified memcached server called repcached instead. Otherwise the cache lookups will be too slow. by http://blog.uxebu.com/2008/06/30/django-and-memcached/

TCP连接状态

CLOSED: 表示初始状态。

LISTEN: 表示服务器端的某个SOCKET处于监听状态,可以接受连接。

SYN_SENT:在服务端监听后,客户端SOCKET执行CONNECT连接时,客户端发送SYN报文,此时客户端就进入SYN_SENT状态,等待服务端的确认

SYN_RCVD: 表示服务端接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

ESTABLISHED:表示连接已经建立了。

FIN_WAIT_1: 这个是已经建立连接之后,其中一方请求终止连接,等待对方的FIN报文。FIN_WAIT_1状态是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。