分类目录归档:语言 & 开发

语言 & 开发

Segfault in libnss when using libcurl from php

$ tools/php-5.2.17/bin/php test1.php
* About to connect() to www.google.com port 443 (#0)
* Trying 74.125.192.103… * connected
* Connected to www.google.com (74.125.192.103) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
Segmentation fault (core dumped)When the url in the script is changed to use HTTP instead of HTTPS, there is no segfault.
Steps To Reproduce Run the script:
$ cat test1.php
< ?php
$urlEndPoint = “https://www.google.com/search”;
$headerArray = array();
$ch = curl_init();
curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_URL, $urlEndPoint);
/*curl_setopt($ch,CURLOPT_HTTPHEADER, $headerArray);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postArray); */

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER, true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0’);
curl_setopt($ch, CURLOPT_VERBOSE, true);

if (!$result = curl_exec($ch)) {
print (curl_error($ch));
}

curl_close ($ch);

echo print_r($result,true);
?>

内核日志:
tail -f /var/log/messages
kernel: php[26564]: segfault at 8048 ip 00007f7a72fede9c sp 00007fffec90edf0 error 4 in libsqlite3.so.0.8.6[7f7a72fd1000+8c000]
gdb记录:
Program received signal SIGSEGV, Segmentation fault.
0x00007fffe9651e9c in sqlite3_file_control () from /usr/lib64/libsqlite3.so.0

 

在Centos的bug列表中,能够找到关于这个bug的说明:

https://bugs.centos.org/view.php?id=7399

https://www.mankier.com/5/cert9.db

Quick fix:

mv /etc/pki/nssdb /etc/pki/nssdb.bak
yum -y reinstall nss

Encoding::UndefinedConversionError

arr=line.force_encoding("utf-8").split("\t")

出现:`encode’: “\xAF\xD0” from GBK to UTF-8 (Encoding::UndefinedConversionError)

更改为以下
arr= line.encode('UTF-8',{
:invalid => :replace,
:undef   => :replace,
:replace => '?'
}).split("\t")

Ruby 发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

Ruby提供了 Net::SMTP 来发送邮件,并提供了两个方法 new 和 start:

new 方法有两个参数:

  • server name 默认为 localhost
  • port number 默认为 25

start 方法有以下参数:

  • server – SMTP 服务器 IP, 默认为 localhost
  • port – 端口号,默认为 25
  • domain – 邮件发送者域名,默认为 ENV[“HOSTNAME”]
  • account – 用户名,默认为 nil
  • password – 用户密码,默认为nil
  • authtype – 验证类型,默认为 cram_md5

SMTP 对象实例化方法调用了 sendmail, 参数如下:

  • source – 一个字符串或数组或每个迭代器在任一时间中返回的任何东西。
  • sender -一个字符串,出现在 email 的表单字段。
  • recipients – 一个字符串或字符串数组,表示收件人的地址。

继续阅读

How to install mod_ruby and eruby on Linux server

mod_ruby embeds the Ruby interpreter into the Apache web server, allowing Ruby CGI scripts to be executed natively. These scripts will start up much faster than without mod_ruby.

1. Install eRuby & mod_ruby1) Install eRuby:

# wget http://www.modruby.net/archive/eruby-1.0.5.tar.gz
# tar -xzvf eruby-1.0.5.tar.gz
# cd eruby-1.0.5/
# ./configure.rb –with-charset=euc-jp –enable-shared
# make; make install

2) Install mod_ruby

i)Download latest mod_ruby tar file
# wget http://www.modruby.net/archive/mod_ruby-1.2.6.tar.gz
# tar -xzvf mod_ruby-1.2.6.tar.gz
# cd mod_ruby-1.2.6/
#  ./configure.rb –enable-eruby –with-apxs=/usr/local/apache/bin/apxs
# make; make install

继续阅读

Linux Shell参数替换

Bash中的$符号的作用是参数替换,将参数名替换为参数所代表的值。对于$来说,大括号是可选的,即$A和${A}代表同一个参数。

${}带冒号的有下面几种表达式:

${parameter:-word}

如果parameter为null或者未设置,整个参数替换表达式值为word

${parameter:=word}

如果parameter为null或者未设置,整个参数替换表达式值为word,并且parameter参数值设置为word

${parameter:?word}

如果parameter为null或者未设置,则打印出错误信息。否则,整个参数替换表达式值为$parameter

${parameter:+word}

如果parameter不为null或者未设置,则整个参数替换表达式值为word

${parameter:offset}

${parameter:offset:length}

继续阅读

linux shell tips

Bash Bits: Check if item is in array

This is a simple function which helps you find out if an (non associative) array has an item. It allows you to call the function with just the array name, not ${arrayname[@]}. It returns 1 if the item is in the array, and 0 if it is not. 继续阅读

Awk1line中文版

AWK单行脚本快速参考 2008年4月28日
编辑: Eric Pement eric [at] pement.org 版本 0.26
翻译: 董一粟 yisudong [at] gmail.com
最新英文版本文件发布在以下地址:
http://www.pement.org/awk/awk1line.txt
最新中文翻译版本文件发布在以下地址:
http://ximix.org/translation/awk1line_zh-CN.txt
翻译问题欢迎联系我:
http://hi.baidu.com/ximix/blog/item/e9334cc2204fa330e5dd3bf2.html

用法:

Unix: awk ‘/pattern/ {print “$1”}’ # 标准 Unix shell环境
DOS/Win: awk ‘/pattern/ {print “$1”}’ # DJGPP 可编译通过
awk “/pattern/ {print \”$1\”}” # GnuWin32,UnxUtils,Mingw环境

需要特别注意的是,DJGPP编译器可以允许awk脚本使用Unix的引号语法
‘/like/ {“this”}’。但是,用户必须知道在DOS/Windows环境下,使用CMD.EXE或者
COMMAND.COM程序的话,单引号并不能保护重定向符号(<, >)和管道(|)。
如果使用双引号的话,在DOS/CMD命令解释器下的特殊符号和他们的特殊含义都
会被忽略。如果你的命令提示符是bash、ksh或者其他的Unix终端,单引号和双引号
会沿用Unix标准的用法。 继续阅读

How to Write Linux Init Scripts Based on LSB Init Standard

LSB stands for Linux Standard Base.

LSB was started by Linux Foundation to reduce the difference between several Linux distributions, and thereby reducing the cost involved in porting between different distributions. Init scripts are one among them to be standardized.

In this article, we will see how to write an Init script that conforms to LSBInit Standard.

Init scripts are used to start|stop a software|service. For example, if you are using postgresql software, we will have a Init script named ‘/etc/init.d/postgresql’ which can be used to ‘start|stop|restart|reload|force-reload|status’. 继续阅读

javap

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。

一般情况下,很少有人使用javap对class文件进行反编译,因为有很多成熟的反编译工具可以使用,比如jad。但是,javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。 继续阅读

jinfo

jinfo可以输出java进程、core文件或远程debug服务器的配置信息。这些配置信息包括JAVA系统参数及命令行参数,如果进程运行在64位虚拟机上,需要指明-J-d64参数,如:jinfo -J-d64 -sysprops pid 继续阅读