0)Python3安装Mysql扩展命令:
pip install pymysql
1)建数据库:
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
2)给库授权:
grant all privileges on test.* to root@127.0.0.1 identified by "test123";
flush privileges;
3)建表:
4)灌入数据:
5)查询:
mysql> select * from person;
+----+------------+------+--------+----------+------------+---------+
| id | name | age | sex | salary | hire_date | dept_id |
+----+------------+------+--------+----------+------------+---------+
| 1 | alex | 28 | 人妖 | 53000.00 | 2010-06-21 | 1 |
| 2 | wupeiqi | 23 | 男 | 8000.00 | 2011-02-21 | 1 |
| 3 | egon | 30 | 男 | 6500.00 | 2015-06-21 | 1 |
| 4 | jingnvshen | 18 | 女 | 6680.00 | 2014-06-21 | 1 |
+----+------------+------+--------+----------+------------+---------+
6)写Python连接代码,mysqlconn.py:
7)运行mysqlconn.py:
python mysqlconn.py
ID: 1 名字: alex 性别: 28
ID: 2 名字: wupeiqi 性别: 23
ID: 3 名字: egon 性别: 30
ID: 4 名字: jingnvshen 性别: 18
最后备注,mysql -h localhost -u root -p (/root/.my.cnf里默认是Localhost的密码)
cat /root/.my.cnf 里的密码,可以登录。
pip install pymysql
1)建数据库:
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
2)给库授权:
grant all privileges on test.* to root@127.0.0.1 identified by "test123";
flush privileges;
3)建表:
4)灌入数据:
5)查询:
mysql> select * from person;
+----+------------+------+--------+----------+------------+---------+
| id | name | age | sex | salary | hire_date | dept_id |
+----+------------+------+--------+----------+------------+---------+
| 1 | alex | 28 | 人妖 | 53000.00 | 2010-06-21 | 1 |
| 2 | wupeiqi | 23 | 男 | 8000.00 | 2011-02-21 | 1 |
| 3 | egon | 30 | 男 | 6500.00 | 2015-06-21 | 1 |
| 4 | jingnvshen | 18 | 女 | 6680.00 | 2014-06-21 | 1 |
+----+------------+------+--------+----------+------------+---------+
6)写Python连接代码,mysqlconn.py:
7)运行mysqlconn.py:
python mysqlconn.py
ID: 1 名字: alex 性别: 28
ID: 2 名字: wupeiqi 性别: 23
ID: 3 名字: egon 性别: 30
ID: 4 名字: jingnvshen 性别: 18
最后备注,mysql -h localhost -u root -p (/root/.my.cnf里默认是Localhost的密码)
cat /root/.my.cnf 里的密码,可以登录。
这是根据自己的笔记整理的,如有错误,欢迎指出来.
tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.
在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);
在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.
linux下可用sysctl -a | grep net.ipv4.tcp_wmem查看系统默认的发送缓存大小:
net.ipv4.tcp_wmem = 4096 16384 81920
这有三个值,第一个值是socket的发送缓存区分配的最少字节数,第二个值是默认值(该值会被net.core.wmem_default覆盖),缓存区在系统负载不重的情况下可以增长到这个值,第三个值是发送缓存区空间的最大字节数(该值会被net.core.wmem_max覆盖).
根据实际测试,如果手工更改了net.ipv4.tcp_wmem的值,则会按更改的值来运行,否则在默认情况下,协议栈通常是按net.core.wmem_default和net.core.wmem_max的值来分配内存的.
应用程序应该根据应用的特性在程序中更改发送缓存大小:
socklen_t sendbuflen = 0;
socklen_t len = sizeof(sendbuflen);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("default,sendbuf:%d\n", sendbuflen);
sendbuflen = 10240;
setsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, len);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("now,sendbuf:%d\n", sendbuflen);
需要注意的是,虽然将发送缓存设置成了10k,但实际上,协议栈会将其扩大1倍,设为20k.
-------------------实例分析----------------------
在实际应用中,如果发送端是非阻塞发送,由于网络的阻塞或者接收端处理过慢,通常出现的情况是,发送应用程序看起来发送了10k的数据,但是只发送了2k到对端缓存中,还有8k在本机缓存中(未发送或者未得到接收端的确认).那么此时,接收应用程序能够收到的数据为2k.假如接收应用程序调用recv函数获取了1k的数据在处理,在这个瞬间,发生了以下情况之一:
A. 发送应用程序认为send完了10k数据,关闭了socket:
发送主机作为tcp的主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack),并且,发送缓存中的8k数据并不清除,依然会发送给对端.如果接收应用程序依然在recv,那么它会收到余下的8k数据(这个前题是,接收端会在发送端FIN_WAIT1状态超时前收到余下的8k数据.),然后得到一个对端socket被关闭的消息(recv返回0).这时,应该进行关闭.
B. 发送应用程序再次调用send发送8k的数据:
假如发送缓存的空间为20k,那么发送缓存可用空间为20-8=12k,大于请求发送的8k,所以send函数将数据做拷贝后,并立即返回8192;
假如发送缓存的空间为12k,那么此时发送缓存可用空间还有12-8=4k,send()会返回4096,应用程序发现返回的值小于请求发送的大小值后,可以认为缓存区已满,这时必须阻塞(或通过select等待下一次socket可写的信号),如果应用程序不理会,立即再次调用send,那么会得到-1的值,在linux下表现为errno=EAGAIN.
C. 接收应用程序在处理完1k数据后,关闭了socket:
接收主机作为主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack).然后,发送应用程序会收到socket可读的信号(通常是select调用返回socket可读),但在读取时会发现recv函数返回0,这时应该调用close函数来关闭socket(发送给对方ack);
如果发送应用程序没有处理这个可读的信号,而是继续调用send,那么第一次会像往常一样继续填充缓存区,然后返回,但如果再次调用send,进程会收到SIGPIPE信号,该信号的默认响应动作是退出进程.
D. 交换机或路由器的网络断开:
接收应用程序在处理完已收到的1k数据后,会继续从缓存区读取余下的1k数据,然后就表现为无数据可读的现象,这种情况需要应用程序来处理超时.一般做法是设定一个select等待的最大时间,如果超出这个时间依然没有数据可读,则认为socket已不可用.
发送应用程序会不断的将余下的数据发送到网络上,但始终得不到确认,所以缓存区的可用空间持续为0,这种情况也需要应用程序来处理.
如果不由应用程序来处理这种情况超时的情况,也可以通过tcp协议本身来处理,具体可以查看sysctl项中的:
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time
所以,要想编写优秀的socket程序也是很不容易的.特别是在为应用做优化时,很多工作都非常的烦琐.
来源:http://blog.chinaunix.net/u2/76292/showart.php?id=2406631
tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.
在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);
在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.
linux下可用sysctl -a | grep net.ipv4.tcp_wmem查看系统默认的发送缓存大小:
net.ipv4.tcp_wmem = 4096 16384 81920
这有三个值,第一个值是socket的发送缓存区分配的最少字节数,第二个值是默认值(该值会被net.core.wmem_default覆盖),缓存区在系统负载不重的情况下可以增长到这个值,第三个值是发送缓存区空间的最大字节数(该值会被net.core.wmem_max覆盖).
根据实际测试,如果手工更改了net.ipv4.tcp_wmem的值,则会按更改的值来运行,否则在默认情况下,协议栈通常是按net.core.wmem_default和net.core.wmem_max的值来分配内存的.
应用程序应该根据应用的特性在程序中更改发送缓存大小:
socklen_t sendbuflen = 0;
socklen_t len = sizeof(sendbuflen);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("default,sendbuf:%d\n", sendbuflen);
sendbuflen = 10240;
setsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, len);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("now,sendbuf:%d\n", sendbuflen);
需要注意的是,虽然将发送缓存设置成了10k,但实际上,协议栈会将其扩大1倍,设为20k.
-------------------实例分析----------------------
在实际应用中,如果发送端是非阻塞发送,由于网络的阻塞或者接收端处理过慢,通常出现的情况是,发送应用程序看起来发送了10k的数据,但是只发送了2k到对端缓存中,还有8k在本机缓存中(未发送或者未得到接收端的确认).那么此时,接收应用程序能够收到的数据为2k.假如接收应用程序调用recv函数获取了1k的数据在处理,在这个瞬间,发生了以下情况之一:
A. 发送应用程序认为send完了10k数据,关闭了socket:
发送主机作为tcp的主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack),并且,发送缓存中的8k数据并不清除,依然会发送给对端.如果接收应用程序依然在recv,那么它会收到余下的8k数据(这个前题是,接收端会在发送端FIN_WAIT1状态超时前收到余下的8k数据.),然后得到一个对端socket被关闭的消息(recv返回0).这时,应该进行关闭.
B. 发送应用程序再次调用send发送8k的数据:
假如发送缓存的空间为20k,那么发送缓存可用空间为20-8=12k,大于请求发送的8k,所以send函数将数据做拷贝后,并立即返回8192;
假如发送缓存的空间为12k,那么此时发送缓存可用空间还有12-8=4k,send()会返回4096,应用程序发现返回的值小于请求发送的大小值后,可以认为缓存区已满,这时必须阻塞(或通过select等待下一次socket可写的信号),如果应用程序不理会,立即再次调用send,那么会得到-1的值,在linux下表现为errno=EAGAIN.
C. 接收应用程序在处理完1k数据后,关闭了socket:
接收主机作为主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack).然后,发送应用程序会收到socket可读的信号(通常是select调用返回socket可读),但在读取时会发现recv函数返回0,这时应该调用close函数来关闭socket(发送给对方ack);
如果发送应用程序没有处理这个可读的信号,而是继续调用send,那么第一次会像往常一样继续填充缓存区,然后返回,但如果再次调用send,进程会收到SIGPIPE信号,该信号的默认响应动作是退出进程.
D. 交换机或路由器的网络断开:
接收应用程序在处理完已收到的1k数据后,会继续从缓存区读取余下的1k数据,然后就表现为无数据可读的现象,这种情况需要应用程序来处理超时.一般做法是设定一个select等待的最大时间,如果超出这个时间依然没有数据可读,则认为socket已不可用.
发送应用程序会不断的将余下的数据发送到网络上,但始终得不到确认,所以缓存区的可用空间持续为0,这种情况也需要应用程序来处理.
如果不由应用程序来处理这种情况超时的情况,也可以通过tcp协议本身来处理,具体可以查看sysctl项中的:
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time
所以,要想编写优秀的socket程序也是很不容易的.特别是在为应用做优化时,很多工作都非常的烦琐.
来源:http://blog.chinaunix.net/u2/76292/showart.php?id=2406631
101007 22:30:31 [ERROR] Can't open the mysql.plugin table. Please run the mysql_upgrade script to create it.
101007 22:30:31 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
101007 22:30:31 mysqld ended
再源码下面执行,如下:
linux-Jack-nb4:~/webserver/mysql-5.1.12-beta # ./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/var
Installing all prepared tables
Fill help tables
To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/local/mysql/bin/mysqladmin -u root password 'new-password'
/usr/local/mysql/bin/mysqladmin -u root -h linux-Jack-nb4 password 'new-password'
See the manual for more instructions.
NOTE: If you are upgrading from a MySQL <= 3.22.10 you should run
the /usr/local/mysql/bin/mysql_fix_privilege_tables. Otherwise you will not be
able to use the new GRANT command!
You can start the MySQL daemon with:
cd /usr/local/mysql ; /usr/local/mysql/bin/mysqld_safe &
Please report any problems with the /usr/local/mysql/bin/mysqlbug script!
The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com
Mysql运行Ok了:
linux-Jack-nb4:~/webserver/mysql-5.1.12-beta # ps aux|grep mysql
root 5515 0.0 0.1 2804 1312 pts/0 S 22:40 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 5566 0.3 1.6 81984 13132 pts/0 Sl 22:40 0:01 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user=mysql --pid-file=/usr/local/mysql/var/linux-Jack-nb4.pid --log-error=/usr/local/mysql/var/linux-Jack-nb4.err --socket=/tmp/mysql.sock --port=3306
前面指定了DB位置,后面就会对于那个--datadir=位置所在:
/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql-/ --user=mysql --pid-file=/data/mysql-//linux-jack-xiang.pid --log-error=/data/mysql-//linux-jack-xiang.err --socket=/tmp/mysql.sock --port=3306
root 5606 0.0 0.0 1900 652 pts/0 S+ 22:47 0:00 grep mysql
root 5515 0.0 0.1 2804 1312 pts/0 S 22:40 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 5566 0.3 1.6 81984 13132 pts/0 Sl 22:40 0:01 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user=mysql --pid-file=/usr/local/mysql/var/linux-Jack-nb4.pid --log-error=/usr/local/mysql/var/linux-Jack-nb4.err --socket=/tmp/mysql.sock --port=3306
前面指定了DB位置,后面就会对于那个--datadir=位置所在:
/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql-/ --user=mysql --pid-file=/data/mysql-//linux-jack-xiang.pid --log-error=/data/mysql-//linux-jack-xiang.err --socket=/tmp/mysql.sock --port=3306
root 5606 0.0 0.0 1900 652 pts/0 S+ 22:47 0:00 grep mysql
在MYSQL启动老失败即:Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
查看错误日志显示:mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
/usr/local/mysql/bin/mysqld: Table 'mysql.plugin' doesn't exist
Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
InnoDB: The first specified data file ./ibdata1 did not exist:
编译命令
gcc -g connect_db.c -L/usr/lib/mysql -lmysqlclient -lz
注意:
如果 /tmp/ccTGmMS21.o: In function 'main':
/tmp/ccTGmMS21.o(.text+0x11): undefined reference to 'mysql_init'
那么参数增加-L参数
如果 /usr/lib/mysql/libmysqlclient.a(my_compress.o): In function 'my_uncompress':
my_compress.o(.text+0xaa): undefined reference to `uncompress'
那么增加-lz参数
如下问题,也是加上-lz:
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_uncompress':
my_compress.c:(.text+0x60): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress_alloc':
my_compress.c:(.text+0x102): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress':
my_compress.c:(.text+0x1ae): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `unpackfrm':
my_compress.c:(.text+0x2bc): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `packfrm':
my_compress.c:(.text+0x3bb): undefined reference to `compress'
collect2: ld returned 1 exit status
如下:
gcc -g connect_db.c -L/usr/lib/mysql -lmysqlclient -lz
注意:
如果 /tmp/ccTGmMS21.o: In function 'main':
/tmp/ccTGmMS21.o(.text+0x11): undefined reference to 'mysql_init'
那么参数增加-L参数
如果 /usr/lib/mysql/libmysqlclient.a(my_compress.o): In function 'my_uncompress':
my_compress.o(.text+0xaa): undefined reference to `uncompress'
那么增加-lz参数
如下问题,也是加上-lz:
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_uncompress':
my_compress.c:(.text+0x60): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress_alloc':
my_compress.c:(.text+0x102): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress':
my_compress.c:(.text+0x1ae): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `unpackfrm':
my_compress.c:(.text+0x2bc): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `packfrm':
my_compress.c:(.text+0x3bb): undefined reference to `compress'
collect2: ld returned 1 exit status
如下:
g++ -o out mysql_fetch_rows.cpp str.cpp str.h -I/usr/local/mysql/include/mysql/ -L/usr/local/mysql/lib/mysql/ -lmysqlclient -lz
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
Nginx虽然目前使用比较多,但还没有提供整合SVN的功能。
还只能是Apache配置SVN,Nginx作为代理。
nginx.conf设置:
apache使用的82端口,整合了SVN。
http://blog.ntsky.com/nginx-svn.html
我的使用方法:
一句简单命令重启nginx:
最近我的多个VPS经常出现502错误,经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单。
但研究了一下nginx帮助后发现,有-s参数可对nginx服务进行管理:
# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
于是我执行
# /usr/local/nginx/sbin/nginx -s reload
nginx已经重启成功。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
首先,调试通过apache的8080,然后再调试通过nginx的代理即可!!!
还只能是Apache配置SVN,Nginx作为代理。
nginx.conf设置:
server {
listen 80;
server_name ppsea.gicp.net;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.10:82;
}
}
listen 80;
server_name ppsea.gicp.net;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.10:82;
}
}
apache使用的82端口,整合了SVN。
http://blog.ntsky.com/nginx-svn.html
我的使用方法:
server {
listen 80;
server_name svn.qq.com;
location / {
root /usr/local/tads/htdocs/svn;
index index.html index.htm;
proxy_pass http://172.25.39.11*:8080;
}
}
listen 80;
server_name svn.qq.com;
location / {
root /usr/local/tads/htdocs/svn;
index index.html index.htm;
proxy_pass http://172.25.39.11*:8080;
}
}
一句简单命令重启nginx:
最近我的多个VPS经常出现502错误,经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单。
但研究了一下nginx帮助后发现,有-s参数可对nginx服务进行管理:
# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
于是我执行
# /usr/local/nginx/sbin/nginx -s reload
nginx已经重启成功。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
首先,调试通过apache的8080,然后再调试通过nginx的代理即可!!!
When installing PHP and MySQL on OSX you may get the error Can’t connect to local MySQL server through socket ‘/var/mysql/mysql.sock’. Or you may also get “No such file or directory” when calling mysql_connect from a PHP page. This occurs because PHP is looking for the file mysql.sock in it’s typical installation location of /var/mysql/mysql.sock. However the MySQL OSX installer actually puts the file in /tmp/mysql.sock. There are two easy ways to solve the problem.
Solution 1: Create a symbolic link
Open terminal and do the following:
sudo su
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
You just created a symbolic link in the place where PHP expects the socket file to be located so it should be happy.
Solution 2: Edit php.ini
If you don’t like the idea of creating a symbolic link, you can also simply alter your php.ini file to point PHP to the real location of mysql.sock.
Locate /etc/php.ini. (If php.ini doesn’t exist on your system, copy /etc/php.ini.default to /etc/php.ini). You will likely have to do this from the terminal unless you have Finder configured to show hidden files. Open the file and update the setting mysql.default_socket so it looks like this:
mysql.default_socket = /tmp/mysql.sock
To commit the change you need to restart Apache. You can do that in System Settings -> Sharing, then uncheck, then recheck Web Sharing.
注解:这个问题,在php和Mysql一台及其的时候特别需要注意,否则mysql没法连接上,而php -m|grep mysql 是有的,无法排查,而在链接其他IP机器是没有该问题的,注意下。
来源:http://verysimple.com/2009/01/07/php-on-os-cant-connect-to-local-mysql-server-through-socket-varmysqlmysqlsock/
Solution 1: Create a symbolic link
Open terminal and do the following:
sudo su
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
You just created a symbolic link in the place where PHP expects the socket file to be located so it should be happy.
Solution 2: Edit php.ini
If you don’t like the idea of creating a symbolic link, you can also simply alter your php.ini file to point PHP to the real location of mysql.sock.
Locate /etc/php.ini. (If php.ini doesn’t exist on your system, copy /etc/php.ini.default to /etc/php.ini). You will likely have to do this from the terminal unless you have Finder configured to show hidden files. Open the file and update the setting mysql.default_socket so it looks like this:
mysql.default_socket = /tmp/mysql.sock
To commit the change you need to restart Apache. You can do that in System Settings -> Sharing, then uncheck, then recheck Web Sharing.
注解:这个问题,在php和Mysql一台及其的时候特别需要注意,否则mysql没法连接上,而php -m|grep mysql 是有的,无法排查,而在链接其他IP机器是没有该问题的,注意下。
来源:http://verysimple.com/2009/01/07/php-on-os-cant-connect-to-local-mysql-server-through-socket-varmysqlmysqlsock/
将nobody用户添加到nogroup 组:
cat /etc/passwd|grep nobody
nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash
第3个字段是65534:意思就是,UID(用户的ID)是500.
第4个字段是65534:意思就是.GID(用户的组ID)的500.
使用usermod -g nogroup nobody就可以把已有的用户nobody加入nogroup 组了.
如下:
添加一个不能ssh登录的用户和制定用户的Home目录位置:
useradd -s /sbin/nologin -d /home/ftpuser -g ftp ftpuser
接下来给用户设置密码,否则此账号不能使用,命令如下
passwd ftpuser
这样就为linux系统添加用户testuser,用户目录指定为//home/ftpuser,属于ftp用户组,且此用户不能登陆系统。
添加移出(不需要加-a即可)组:
[root@webta_9090 ~]# usermod -a -Gappops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops),601(appops)
[root@webta_9090 ~]# usermod -Girdcops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops)
usermod -g nogroup nobody
cat /etc/passwd|grep nobody
nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash
第3个字段是65534:意思就是,UID(用户的ID)是500.
第4个字段是65534:意思就是.GID(用户的组ID)的500.
使用usermod -g nogroup nobody就可以把已有的用户nobody加入nogroup 组了.
如下:
:nobody:/var/lib/nobody:/bin/bash
添加一个不能ssh登录的用户和制定用户的Home目录位置:
useradd -s /sbin/nologin -d /home/ftpuser -g ftp ftpuser
接下来给用户设置密码,否则此账号不能使用,命令如下
passwd ftpuser
这样就为linux系统添加用户testuser,用户目录指定为//home/ftpuser,属于ftp用户组,且此用户不能登陆系统。
添加移出(不需要加-a即可)组:
[root@webta_9090 ~]# usermod -a -Gappops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops),601(appops)
[root@webta_9090 ~]# usermod -Girdcops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops)
linux可以使用lsof命令能查看到端口对应的进程号:
[root@www ~]# lsof -i
COMMAND PID USER FD TYPE DEVICESIZE NODE NAME
Sshd 2444 root 3u IPv4 7376 TCP 172.20.1.104:ssh (LISTEN)
Sshd 16187 root 3u IPv4 327678 TCP 172.20.1.104:ssh->172.20.1.181:56600 (ESTABLISHED)
在windows, 使用netstat -o参数:
-o 显示与每个连接相关的所属进程 ID。
来源:http://hi.baidu.com/fanniwz/blog/item/be108037a50f051b91ef3935.html
[root@www ~]# lsof -i
COMMAND PID USER FD TYPE DEVICESIZE NODE NAME
Sshd 2444 root 3u IPv4 7376 TCP 172.20.1.104:ssh (LISTEN)
Sshd 16187 root 3u IPv4 327678 TCP 172.20.1.104:ssh->172.20.1.181:56600 (ESTABLISHED)
在windows, 使用netstat -o参数:
-o 显示与每个连接相关的所属进程 ID。
来源:http://hi.baidu.com/fanniwz/blog/item/be108037a50f051b91ef3935.html
指针指向结构体数组实例
Unix/LinuxC技术 jackxiang 2010-12-28 22:56
#include <iostream>
using namespace std;
struct ENTINFO {
char ent_add[255];
};
typedef struct ENTINFO _ENTINFO;
int main(int argc, char *argv[])
{
_ENTINFO *ent_info_pointer;
_ENTINFO ent_info[1024];
memset(ent_info,0,sizeof(_ENTINFO)*1024);
strcpy(ent_info[0].ent_add,"guangdong shenzhen nanshan new haofang garden");
strcpy(ent_info[1].ent_add,"guangdong shenzhen nanshan haofang garden");
strcpy(ent_info[2].ent_add,"guangdong shenzhen nanshan haofang garden 6 floor");
ent_info_pointer = ent_info;
printf("ent_info_pointer->ent_add=%s\n",ent_info[0].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[1].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[2].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
return 0;
}
using namespace std;
struct ENTINFO {
char ent_add[255];
};
typedef struct ENTINFO _ENTINFO;
int main(int argc, char *argv[])
{
_ENTINFO *ent_info_pointer;
_ENTINFO ent_info[1024];
memset(ent_info,0,sizeof(_ENTINFO)*1024);
strcpy(ent_info[0].ent_add,"guangdong shenzhen nanshan new haofang garden");
strcpy(ent_info[1].ent_add,"guangdong shenzhen nanshan haofang garden");
strcpy(ent_info[2].ent_add,"guangdong shenzhen nanshan haofang garden 6 floor");
ent_info_pointer = ent_info;
printf("ent_info_pointer->ent_add=%s\n",ent_info[0].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[1].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[2].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
return 0;
}
运行结果:
ent_info_pointer->ent_add=guangdong shenzhen nanshan new haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden 6 floor
ent_info_pointer->ent_add=guangdong shenzhen nanshan new haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden 6 floor
strcture_array_test.cpp
root@17*.2*.38.78:~/c++/struct# ./a.out
No. Name sex age Score
10101Tom M 18 0
10102John M 19 0
10103Mary F 17 0
[实践OK]Linux下用Grep -E参数实现$grep -E ^[a-Z] supervisord.conf显示非注释项,ABC def abc,加上正则表达式实现,多个函数查找的方法,及实现查看所查找单词的前三行后两行的环绕搜索,grep一个多行单独IP间隔包含文字里的IP列表出来,grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用。
Php/Js/Shell/Go jackxiang 2010-12-28 20:14
cat xxxx.txt|grep -Ev "无锡|腾讯云|华为云|微软云|阿里云|百度云|金山云" #grep 正则接合v排除的查询
api-itv-xxxx-cn-master-php-db578496b-zxxnj 6/6 Running 0 65m
kubectl get po -l pro=itv_api|grep -E "Running +0" #加号+:匹配1个或多个前面的字符,它和星号*的作用相似,但它不匹配0个字符的情况。比如,"ab+c"将匹配"abc"、“abbc”、“abbb...c”等。
不用加正则参数也成,直接用egrep:
rpm -qf /bin/egrep
grep-2.20-3.el6_7.1.x86_64
rpm -ql grep-2.20-3.el6_7.1.x86_64|grep grep
/bin/egrep
/bin/fgrep
/bin/grep
cat videoupload.php |grep upload --color //给加点颜色。
背景:实现一次性查找多个函数的awk实现,以及grep一个文件里的所有IP行:
-n :grep 行输出,--line-number print line number with output lines
一)Grep -E参数,加上正则表达式实现,多个函数查找,如下:
配上shell 文件 findfunPath.sh如下:
简单示例:
二)查看所查找单词的前三行后两行的环绕搜索:
[root@iZ25dcp92ckZ multepoolserver]# grep -rin -B 3 -A 2 "pthread_create Failed" ./multepoolser.c
569- threadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
570- //if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&i)){
571- if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&threadNum[i])){
572: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
573- loger(errOut);
574- return -1;
--
591- writeThreadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
592- //if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, NULL )){
593- if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, (void *)&writeThreadNum[i])){
594: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
595- loger(errOut);
596- return -1;
三)grep一个多行单独IP间隔包含文字里的IP列表出来:
四)grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用之查找域名里的root有哪些路径:
grep -Er "common.jackxiang.com|vote.jackxiang.com|answer.jackxiang.com|scratch.jackxiang.com|api.itv.jackxiang.com|common.itv.jackxiang.com|api.itv.cctv.com|common.itv.cctv.com" ./ -A 7|grep root
./answer.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./api.itv.jackxiang.com.conf: root /data/www/api.itv.jackxiang.com/;
./vote.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./scratch.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./common.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
api-itv-xxxx-cn-master-php-db578496b-zxxnj 6/6 Running 0 65m
kubectl get po -l pro=itv_api|grep -E "Running +0" #加号+:匹配1个或多个前面的字符,它和星号*的作用相似,但它不匹配0个字符的情况。比如,"ab+c"将匹配"abc"、“abbc”、“abbb...c”等。
不用加正则参数也成,直接用egrep:
rpm -qf /bin/egrep
grep-2.20-3.el6_7.1.x86_64
rpm -ql grep-2.20-3.el6_7.1.x86_64|grep grep
/bin/egrep
/bin/fgrep
/bin/grep
cat videoupload.php |grep upload --color //给加点颜色。
背景:实现一次性查找多个函数的awk实现,以及grep一个文件里的所有IP行:
-n :grep 行输出,--line-number print line number with output lines
一)Grep -E参数,加上正则表达式实现,多个函数查找,如下:
grep -Erin 'atoi|itoa|atol|ltoa|intval' ./
配上shell 文件 findfunPath.sh如下:
#!/bin/bash
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
简单示例:
findfunPath.sh /usr/local/pro/
二)查看所查找单词的前三行后两行的环绕搜索:
[root@iZ25dcp92ckZ multepoolserver]# grep -rin -B 3 -A 2 "pthread_create Failed" ./multepoolser.c
569- threadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
570- //if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&i)){
571- if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&threadNum[i])){
572: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
573- loger(errOut);
574- return -1;
--
591- writeThreadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
592- //if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, NULL )){
593- if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, (void *)&writeThreadNum[i])){
594: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
595- loger(errOut);
596- return -1;
三)grep一个多行单独IP间隔包含文字里的IP列表出来:
四)grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用之查找域名里的root有哪些路径:
grep -Er "common.jackxiang.com|vote.jackxiang.com|answer.jackxiang.com|scratch.jackxiang.com|api.itv.jackxiang.com|common.itv.jackxiang.com|api.itv.cctv.com|common.itv.cctv.com" ./ -A 7|grep root
./answer.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./api.itv.jackxiang.com.conf: root /data/www/api.itv.jackxiang.com/;
./vote.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./scratch.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./common.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
使用Memcached实现Session共享阅读全文
shell中如何一行写while:
From:http://blog.sina.com.cn/s/blog_ac843e330101c55g.html
if elif else demo:
wile demo:
函数示例:
From:http://blog.sina.com.cn/s/blog_ac843e330101c55g.html
if elif else demo:
#example
if [ $1 -gt 90 ];then
echo "Good, $1"
elif [ $1 -gt 70 ];then
echo "OK, $1"
else
echo "Bad, $1"
fi
if [ $1 -gt 90 ];then
echo "Good, $1"
elif [ $1 -gt 70 ];then
echo "OK, $1"
else
echo "Bad, $1"
fi
wile demo:
#example
i=1
sum=0
while test $i -le 100
do
let sum=$sum+$i
let i=$i+1
done
echo "1+2+3...+100="$sum
i=1
sum=0
while test $i -le 100
do
let sum=$sum+$i
let i=$i+1
done
echo "1+2+3...+100="$sum
函数示例:
#example
function add()
{
let $3=$1+$2
}
add 1 2 ret
echo $ret
function add()
{
let $3=$1+$2
}
add 1 2 ret
echo $ret
g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
我采用:
~/grep# grep -Erin 'atoi|itoa|atol|ltoa' ./
./itoa.txt:1:itoa
./itoa.txt:2:atoi
./itoa.txt:3:atoi
./itoa.txt:4:atoi
./itoa.txt:5:atoi
./atoi.txt:1:atoi
./atoi.txt:2:atoi
./atoi.txt:3:atoi
./atoi.txt:4:atoi
./atoi.txt:5:atoi
./atol.txt:1:atol
./atol.txt:2:atol
./atol.txt:3:atol
./atol.txt:4:atol
./atol.txt:5:atol
./atol.txt:6:atol
./ltoa.txt:1:ltoa
./ltoa.txt:2:ltoa
./ltoa.txt:3:ltoa
./ltoa.txt:4:ltoa
./ltoa.txt:5:ltoa
./ltoa.txt:6:ltoa
阅读全文
[sam@chenwy sam]$ grep -E '219|216' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
我采用:
grep -Erin 'atoi|itoa|atol|ltoa' ./
~/grep# grep -Erin 'atoi|itoa|atol|ltoa' ./
./itoa.txt:1:itoa
./itoa.txt:2:atoi
./itoa.txt:3:atoi
./itoa.txt:4:atoi
./itoa.txt:5:atoi
./atoi.txt:1:atoi
./atoi.txt:2:atoi
./atoi.txt:3:atoi
./atoi.txt:4:atoi
./atoi.txt:5:atoi
./atol.txt:1:atol
./atol.txt:2:atol
./atol.txt:3:atol
./atol.txt:4:atol
./atol.txt:5:atol
./atol.txt:6:atol
./ltoa.txt:1:ltoa
./ltoa.txt:2:ltoa
./ltoa.txt:3:ltoa
./ltoa.txt:4:ltoa
./ltoa.txt:5:ltoa
./ltoa.txt:6:ltoa
阅读全文
亦庄,立足于北京国际新城的新高度,随着政策的利好导向,正在高速前行,成为北京在世界的代言。亦庄路东区作为以产业为主导功能的片区成为重点区域。丰富的交通资源为区域发展提供动力,亦庄线、M12线在此交会, 2010年年底开通的轻轨亦庄线,北接地铁5号线,20分钟直抵宋家庄。M12建成后通达国贸,将与CBD区域融合。
双轨建构 京南置业黄金点
距L2和M12换乘站经海路站仅280米VITA国际,于2010年11月11日破土动工, 11月12日售楼处开放。是目前北京距离地铁最近的在售低总价精装小户型,业主出门即可便捷接入北京城市地铁网。在经历通州、奥北、中关村等轻轨沿线不动产购置热潮之后,VITA国际的轨道效应将引领新一轮资本流向,开启全新地铁时代。
与VITA国际一个街区之隔,将建造亦庄的公交枢纽站,届时公交枢纽将实现“零距离”换乘。VITA国际门前双轨交会,瞬间直抵繁华。
保守估计:从开盘到交房每平米净赚4000非常轻松。仅供参考!
欢迎来电垂询:13269811169 陈娅婷
11月20日正式接受排号!排号可享受优惠!
双轨建构 京南置业黄金点
距L2和M12换乘站经海路站仅280米VITA国际,于2010年11月11日破土动工, 11月12日售楼处开放。是目前北京距离地铁最近的在售低总价精装小户型,业主出门即可便捷接入北京城市地铁网。在经历通州、奥北、中关村等轻轨沿线不动产购置热潮之后,VITA国际的轨道效应将引领新一轮资本流向,开启全新地铁时代。
与VITA国际一个街区之隔,将建造亦庄的公交枢纽站,届时公交枢纽将实现“零距离”换乘。VITA国际门前双轨交会,瞬间直抵繁华。
保守估计:从开盘到交房每平米净赚4000非常轻松。仅供参考!
欢迎来电垂询:13269811169 陈娅婷
11月20日正式接受排号!排号可享受优惠!