linux 别名命令——alias

linux的别名功能

功能说明:设置指令的别名。
语  法:alias[别名]=[指令名称]

参  数 :若不加任何参数,则列出目前所有的别名设置。
举    例 :ermao@lost-desktop:~$ alias
                alias egrep=’egrep –color=auto’
               alias fgrep=’fgrep –color=auto’
                
alias grep=’grep –color=auto’
                alias l=’ls -CF’
                alias la=’ls -A’
                alias ll=’ls -alF’
                alias ls=’ls –color=auto’

说     明:用户可利用alias,自定指令的别名。若仅输入alias,则可列出目前所有的别名设置。 alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在/etc/profile或自己的~/.bashrc中设定指令的别名。

    还有,如果你想给每一位用户都生效的别名,请把alias la=’ls -al’ 一行加在/etc/bashrc最后面,bashrc是环境变量的配置文件 /etc/bashrc和~/.bashrc 区别就在于一个是设置给全系统一个是设置给单用户使用.

    利用alias可以把很长的命令变成任意我们喜欢的简短的,
比如:alias cd=’rm -rf’     0.0! ,呵呵开个玩笑

    如果想永久生效,就把这条写入到 /etc/bashrc里面

基于 Docker 的 PHP 开发环境

【编者的话】本文作者是Geoffrey,他是一个PHP的Web开发者,喜欢DevOps和Docker。本文主要介绍了如何使用Docker构建 PHP的开发环境,文中作者也探讨了构建基于Docker的开发环境应该使用单容器还是多容器,各有什么利弊。推荐PHP开发者阅读。

现在很多开发者都使用Vagrant来管理他们的虚拟机开发环境,Vagrant确实很酷, 不过也有不少缺点(最主要的是它占用太多的资源)。在容器技术、Docker和更多类Docker技术出现后,解决这个问题就变得简单了。

免责声明

由于boot2docker的工作方式,本文所述的方法在你的环境中可能无法正常运行。如果需要在非Linux环境下共享文件夹到Docker容器,还需要注意更多额外的细节。后续我会写篇文章专门来介绍实际遇到的问题。

怎样才算是好的开发环境

首先,我们得知道什么才是好的开发环境, 对于我而言,一个好的开发环境需要具备以下几个特点:

  1. 可随意使用。我必须可以随意删除和创建新的环境。
  2. 快速启动。我想要用它工作时候,它立马就能用。
  3. 易于更新。在我们行业中,事物发展变化非常快,必须能让我很容易将我的开发环境更新到新的软件版本。

而Docker都支持以上这些特点,甚至更多。你几乎可以即时销毁和重建容器,而更新环境只需要重建你当前使用的镜像即可。

什么是PHP开发环境

目前Web应用错综复杂,PHP开发环境需要很多的东西,为了保证环境的简单性,需要做各种各样的限制。
我们这次使用Nginx、PHP5-FPM、MySQL来运行Synmfony项目。由于在容器中运行命令行会更复杂,所以这方面的内容我会放到下一篇博客中再说。

Pet 与 Cattle

另一个我们要讨论的重点是:我们要把开发环境部署在多容器还是单容器中。 两种方式各有优点:

  • 单容器易于分发、维护。因为它们是独立的,所有的东西都运行在同一个容器中,这点就像是一个虚拟机。但这也意味着,当你要升级其中的某样东西(比如PHP新版本)的时候, 需要重新构建整个容器。
  • 多容器可以在添加组件时提供更好的模块化。因为每个容器包含了堆栈的一部分:Web、PHP、MySQL等,这样可以单独扩展每个服务或者添加服务,并且不需要重建所有的东西。

因为我比较懒,加上我需要在我的笔记本上放点别的内容,所以,这里我们只介绍单个容器的方法。

初始化工程

首先要做的是初始化一个新的Symfony工程. 推荐的方法是用composer的create-project命令。本来可以在工作站上安装composer,但是那样太简单了。这次我们通过Docker来使用它。
我之前发过一篇关于Docker命令的文章:make docker commands(好吧,我说谎了,我本来把它写在这篇文章中了,然后觉得把它独立出来会比较好)。

不管怎么样,你可以读一下。接下来如果还没有composer命令的话,你可以创建一个属于自己的composer 别名。

$ alias composer="docker run -i -t -v \$PWD:/srv ubermuda/composer"

现在你可以初始化Symfony工程了:

$ composer create-project symfony/framwork-standard-edition SomeProject

帅呆了!下面来点实在的工作。(省略了博主自娱自乐的一堆balabla….原文:Awesome. Give yourself a high-five, get a cup of coffee or whatever is your liquid drug of choice, and get ready for the real work.)

容器

构建一个运行标准Symfony项目且自给自足的容器相当容易,只需要安装好常用的Nginx、PHP5-FPM和MySQL-Server即可,然后把预先准备好的Nginx的虚拟主机配置文件扔进去,再复制一些配置文件进去就完事了。

本容器的源代码在GitHub上的 ubermuda/docker-symfony仓库中可以找到。 Dockerfile 是Docker构建镜像要用到的配置文件,我们来看一下:

FROM debian:wheezy

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update -y
RUN apt-get install -y nginx php5-fpm php5-mysqlnd php5-cli mysql-server supervisor

RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
RUN sed -e 's/;listen\.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
RUN sed -e 's/;listen\.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

ADD vhost.conf /etc/nginx/sites-available/default
ADD supervisor.conf /etc/supervisor/conf.d/supervisor.conf
ADD init.sh /init.sh

EXPOSE 80 3306

VOLUME ["/srv"]
WORKDIR /srv

CMD ["/usr/bin/supervisord"]

我们通过扩展 debian:wheezy 这个基础镜像开始,然后通过一系列的sed命令来配置Nginx和PHP5-FPM。

RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
RUN sed -e 's/;listen\.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
RUN sed -e 's/;listen\.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

这里我们要做两件事。 首先配置PHP5-FPM和Nginx让他们在前台运行以便supervisord可以追踪到他们。
然后,配置PHP5-FPM以指定的用户运行Web-Server,并处理好文件权限。

接下来需要安装一组配置文件,首先是Nginx的虚拟主机配置文件vhost.conf:

server {
    listen 80;

    server_name _;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    root /srv/web;
    index app_dev.php;

     ocation / {
        try_files $uri $uri/ /app_dev.php?$query_string;
    }

     ocation ~ [^/]\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
    }
}

因为我们不需要域名,所以把server_name设成了_(有点像perl的$_占位符变量), 并配置根目录(document root)为/svr/web, 我们会把应用程序部署在/srv下,剩下的就是标准的Mginx + PHP5-FPM配置.

因为一个容器每次只能运行一个程序, 我们需要supervisord(或者任何别的进程管理器,不过我比较中意supervisord)。幸运的是, 这个进程管理器会产生我们需要的所有进程!下面是一小段supervisord的配置:

[supervisord]
nodaemon=true

[program:nginx]
command=/usr/sbin/nginx

[program:php5-fpm]
command=/usr/sbin/php5-fpm

[program:mysql]
command=/usr/bin/mysqld_safe

[program:init]
command=/init.sh
autorestart=false
redirect_stderr=true
redirect_stdout=/srv/app/logs/init.log

这里我们需要做的是定义所有的服务, 加上一个特殊的program:init进程,它不是一个实际的服务,而是一个独创的运行启动脚本的方式。

这个启动脚本的问题在于,它通常需要先启动某些服务。比如,你可能要初始化一些数据库表,但前提是你得先把MySQL跑起来,一个可能的解决办法 是,在启动脚本中启动MySQL,然后初始化表,然后为了防止影响到supervisord的进程管理,需要停掉MySQL,最后再启动 supervisord。

这样的脚本看起来类似下面这样:

/etc/init.d/mysql start
app/console doctrine:schema:update --force
/etc/init.d/mysql stop

exec /usr/bin/supervisord

看起来丑爆了有木有,咱换种方式,让supervisor来运行它并且永不重启。
实际的init.sh脚本如下:

#!/bin/bash

RET=1

while [[ RET -ne 0 ]]; do
    sleep 1;
    mysql -e 'exit' > /dev/null 2>&1; RET=$?
done

DB_NAME=${DB_NAME:-symfony}

mysqladmin -u root create $DB_NAME

if [ -n "$INIT" ]; then
    /srv/$INIT
fi

脚本先等待MySQL启动,然后根据环境变量DB_NAME创建DB,默认为symfony, 然后在INIT环境变量中查找要运行的脚本,并尝试运行它。本文的结尾有说明如何使用这些环境变量。
阅读全文及发表评论,请移步:http://linux.cn/article-4592-1-qqmail.html

360 安全卫士 for Linux 使用结果

测试了一把,结果显示360基本对Linux社区规范和安全常识不give a fuck。

胡乱打包

首先,这个deb包就是胡乱打包,依赖关系就没弄好:

$ dpkg-deb -I 360safeforlinux-3.0.0.66-stripped.deb 
[...]
 Package: 360safeforlinux
 Version: 3.0.0.66
 Architecture: amd64
 Maintainer: qihu360 company
 Installed-Size: 23617
 Depends: libc6 (>= 2.14),libglib2.0-0 (>= 2.38),python2.7 (>= 2.7.6),openssl(>= 1.0),curl,libqt4-network(>= 4.8.5),libqt4-sql(>= 4.8.5)
 Section: gnome
 Priority: required
 Essential: yes
 Description: 360 safe for linux

但是还实际依赖了libpython2.7和libqtgui4两个库没有标明,要我手动修复。

滥用 Essential

这个打包还通过滥用Essential标记来制造卸载的麻烦。

root@debian-amd64:/home/user# apt-get remove 360safeforlinux
[...]
The following packages will be REMOVED:
  360safeforlinux
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
  360safeforlinux
[...]
**You are about to do something potentially harmful.**
To continue type in the phrase 'Yes, do as I say!'
 ?] 
Abort.

root@debian-amd64:/home/user# aptitude remove 360safeforlinux
The following packages will be REMOVED:  
  360safeforlinux 
[...]
The following ESSENTIAL packages will be REMOVED!
  360safeforlinux 

WARNING: Performing this action will probably cause your system to break!
         Do NOT continue unless you know EXACTLY what you are doing!
To continue, type the phrase "I am aware that this is a very bad idea":

关于Essential打包政策,DebianUbuntu都只保留给最必要的包。

随意使用 setuid

安装后dpkg配置时它的postinst脚本直接给加上了setuid。如此随意地使用setuid,还能自称是安全?

if [ "$1" = "configure" ];then
    chmod u+s /opt/360safeforlinux/s360SafeForLinux
[...]
fi

这个的意思就是,以普通用户权限运行这个东西,它会变成root:

user@debian-amd64:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev)
user@debian-amd64:~$ start360 &
[1] 4512
user@debian-amd64:~$ pstree -u
init─┬─dhclient
     ├─5*[getty]
     ├─login───bash(user)───startx───xinit─┬─Xorg(root)
     │                                     └─x-window-manage
[...]
     ├─urxvtd(user)
     └─urxvtd(user)─┬─bash───start360(root)─┬─{BackendTaskThre}
                    │                       ├─{BrowserHomePage}
                    │                       ├─{CpuMemUseState}
                    │                       ├─{FileWatcher}
                    │                       ├─{IsolateZone}
                    │                       ├─{LogCleanThread}
                    │                       ├─2*[{MyThread}]
                    │                       ├─{VdUpload}
                    │                       └─3*[{start360}]
                    └─bash───pstree

内核模块?

dpkg的prerm脚本还有奇怪的东西:

rc=`lsmod | grep "rk360" | xargs echo`
if [ -n "$rc" ];then
    rmmod rk360 2>/dev/null 1>&2
    rm -rf /etc/360safe/360safe.ko 2>/dev/null 1>&2
fi

rc=`lsmod | grep "immu" | xargs echo`
if [ -n "$rc" ];then
    rmmod immu 2>/dev/null 1>&2
    rm -rf /etc/360safe/immu.ko 2>/dev/null 1>&2
fi

360不仅不满足于root权限,还在用内核模块?不过这次使用中并未发现这两个内核模块。

运行的怪现状

start360启动,然后有两个运行时怪现状:

  1. 把pid保存到/etc/360safe/360safeforlinux.pid。会不会遵守FHS?
  2. 疯狂扫描系统文件,powertop显示闲置状态每秒30个唤醒,笔记本电池寿命已死。会不会用inotify?

功能的真相

它提供了一些功能。

  • 全盘扫描。所有文件都是按照标准设计的,哪个恶意哪个不恶意真不是360能说了算的。
  • 一键清理。可以使用这个命令替代:rm -r ~/.adobe ~/.cache ~/.local ~/.macromedia ~/.thumbnails /tmp/*。但是这些临时文件是有用的,也占不了多大空间。
  • 优化加速。就是把update-rc.d/chkconfig封装了一个图形界面。
  • 软件管家。360的私货app store。
  • 文件粉碎。Linux下有什么无法删除的“顽固”文件?还是重新发明了coreutils的/usr/bin/shred?来删除/proc试试?
  • 网盾。就是Firefox和Chrome的插件。
    ./etc/360safe/urlcheck
    ./etc/360safe/urlcheck/normalize.py
    ./etc/360safe/urlcheck/Firefox
    ./etc/360safe/urlcheck/Firefox/360webshield@qihoo.com.xpi
    ./etc/360safe/urlcheck/lcloud.ini
    ./etc/360safe/urlcheck/browserextensionsinstaller.py
    ./etc/360safe/urlcheck/Chrome
    ./etc/360safe/urlcheck/Chrome/360WebShield.crx
    
  • 还有二进制库的“云查杀”,QEX引擎,BitDefender引擎。不了解有什么用处。

许可证列举

360唯有一点用功了,就是列了一大堆非GPL的许可证:

license/zlib_license.txt
license/c-ares_license.txt
license/qt_license_lgpl.txt
license/unrar_license.txt
license/sqlite_license.txt
license/elftoolchain_license.txt
license/libcurl_license.txt
license/7-Zip_license.txt
license/boost_license.txt
license/openssl_licnese.txt
license/minizip_license.txt
license/jsoncpp_license.txt
license/protobuf_license.txt
license/Noto fonts_license.txt
license/qt_lgpl_exception.txt

这样人们就无权索要源代码。不过,一个安全产品不公开源代码,然后用setuid拿了root还要搞内核模块,谁知道你要干嘛?总之,360对Linux社区规范和安全常识基本不give a fuck。

为什么说缺乏安全常识。

首先,用setuid给一个图形网络程序整体提权到root就是自送漏洞,全身是洞,只要发现一个,就是远程root。

其次,用户界面永远不需要root,提权进行特定动作特定配置有polkit,更新系统配置文件可以有facl可以有SELinux/AppArmor,内核级文件扫描可以有auditd,这些机制都不需要一个以root运行的用户界面造成巨大的攻击面。

第三,以root权限运行网上下载的二进制文件是一切病毒发生的起源。尤其是这种既没有源代码可审计,也没有数字签名可验证真实性的东西。

注:本站对本文有部分修改。原文来自: http://www.v2ex.com/t/158380
阅读全文及发表评论,请移步:http://linux.cn/article-4574-1-qqmail.html

PHP优化杂烩

讲 PHP 优化的文章往往都是教大家如何编写高效的代码,本文打算从另一个角度来讨论问题,教大家如何配置高效的环境,如此同样能够达到优化的目的。

pool

一个让人沮丧的消息是绝大多数 PHP 程序员都忽视了池的价值。这里所说的池可不是指数据库连接池之类的东西,而是指进程池,PHP 允许同时启动多个池,每个池使用不同的配置,各个池之间尊重彼此的主权领土完整,互不干涉内政。

pool

pool

有什么好处呢?默认情况下,PHP 只启用了一个池,所有请求均在这个池中执行。一旦某些请求出现拥堵之类的情况,那么很可能会连累整个池出现火烧赤壁的结局;如果启用多个池,那么可以把请 求分门别类放到不同的池中执行,此时如果某些请求出现拥堵之类的情况,那么只会影响自己所在的池,从而控制故障的波及范围。

listen

虽然 Nginx 和 PHP 可以部署在不同的服务器上,但是实际应用中,多数人都习惯把它们部署在同一台服务器上,如此就有两个选择:一个是 TCP,另一个是 Unix Socket。

listen

listen

和 TCP 比较,Unix Socket 省略了一些诸如 TCP 三次握手之类的环节,所以相对更高效,不过需要注意的是,在使用 Unix Socket 时,因为没有 TCP 对应的可靠性保证机制,所以最好把 backlog 和 somaxconn 设置大些,否则面对高并发时会不稳定。

pm

进程管理有动态和静态之分。动态模式一般先启动少量进程,再按照请求数的多少实时调整进程数。如此的优点很明显:节省资源;当然它的缺点也很明显: 一旦出现高并发请求,系统将不得不忙着 FORK 新进程,必然会影响性能。相对应的,静态模式一次性 FORK 足量的进程,之后不管请求量如何均保持不变。和动态模式相比,静态模式虽然消耗了更多的资源,但是面对高并发请求,它不需要执行高昂的 FORK。

pm

pm

对大流量网站而言,除非服务器资源紧张,否则静态模式无疑是最佳选择。

pm.max_children

启动多少个 PHP 进程合适?在你给出自己的答案之前,不妨看看下面的文章:

一个 CPU 在某一个时刻只能处理一个请求。当请求数大于 CPU 个数时,CPU 会划分时间片,轮流执行各个请求,既然涉及多个任务的调度,那么上下文切换必然会消耗一部分性能,从这个意义上讲,进程数应该等于 CPU 个数,如此一来每个进程都对应一个专属的 CPU,可以把上下文切换损失的效率降到最低。不过这个结论仅在请求是 CPU 密集型时才是正确的,而对于一般的 Web 请求而言,多半是 IO 密集型的,此时这个结论就值得商榷了,因为数据库查询等 IO 的存在,必然会导致 CPU 有相当一部分时间处于 WAIT 状态,也就是被浪费的状态。此时如果进程数多于 CPU 个数的话,那么当发生 IO 时,CPU 就有机会切换到别的请求继续执行,虽然这会带来一定上下文切换的开销,但是总比卡在 WAIT 状态好多了。

那多少合适呢?要理清这个问题,我们除了要关注 CPU 之外,还要关注内存情况:

PHP Memory

PHP Memory

如上所示 top 命令的结果中和内存相关的列分别是 VIRT,RES,SHR。其中 VIRT 表示的是内存占用的理论值,通常不用在意它,RES 表示的是内存占用的实际值,虽然 RES 看上去很大,但是包含着共享内存,也就是 SHR 显示的值,所以单个 PHP 进程实际独立占用的内存大小等于「RES – SHR」,一般就是 10M 上下。以此推算,理论上 1G 内存能支撑大概一百个 PHP 进程,10G 内存能大概支撑一千个 PHP 进程。当然并不能粗暴认为越多越好,最好结合 PHP 的 status 接口,通过监控活跃连接数的数量来调整。

说明:关于 Web 并发模型方面的知识建议参考范凯的「Web并发模型粗浅探讨」。
阅读全文及发表评论,请移步:http://linux.cn/article-4544-1-qqmail.html

shell实现php并行处理的想法

shell以脚本方式调用php实现数据按月分批次的并行处理,初步测试,可以使用,该方法可用于处理时间久,数据量大的一些数据迁移的情况

shell以脚本方式调用php实现数据按月分批次的并行处理,本例只是初步想法,后期会进行实际测试和验证

datetime=`date +'%Y-%m-%d %H:%M:%S'` #以0000-00-00 00:00:00 的格式获取当前时间并赋值给变量$datetime

ckdatetime=`date -d"2014-06-01 00:00:00" +%s` #获得指定日期的unix时间戳
edate=`date +'%Y-%m-%d'`
i=0
num=2
while :
do
    sdatetime=`date -d"-$num month" +%s` #获取$num月前的时间戳
    sdate=`date -d @$sdatetime "+%Y-%m-%d"` #将时间戳格式化
    parm=${sdate}' '${edate} #将变量$sdate 和 变量$edate 作为字符串连接起来,中间加一个空格(可作执行php的参数用)
    arrays[$i]=${Url}${parm} #$Url为要执行的php的路径,带上参数
    edate=$sdate
    if [ $sdatetime -le $ckdatetime ]
    then
        break
    fi
    num=` expr $num + 2 `
    i=` expr $i + 1 `
done

excel 上传失败 excelreader 读取失败

excel 上传失败 excelreader 读取失败,可能是文件超过php默认上传文件的上限导致的,调一下就可以了

今天在用excelreader向数据库中导入数据时,数据总是为空,开始以为是excelreader有最大条数限制,因为将条数减少后是可以导入成功的。研究了下源码没虽然怎么看懂,但是应该不是excelreader的问题,
既然是跟数据条数有关,会不会是上传的文件的大小超出了php的限制呢?

打开php.ini 搜索 “upload_max_filesize”

结果为:upload_max_filesize = 2M

查看要上传的excel的大小,果然是大于2M的,将2M改为10M后,重启php,再执行导入excel的功能,导入成功,ok,搞定。
值得一提的是,php还有对post的所有数据大小的限制post_max_size,这个配置的默认大小是8M,如果post的数据大于8M的话,也是不能成功的,要相应调大一点,另外,文件大了执行时间就长了,使用set_time_limit(0);将php线程时间设为不超时就可以

centOS下编译安装php5.7后再开启GD库功能

本以为用php的扩展至直接编译扩展php模块就行了,没想到这么麻烦……

操作流程如下:

$ cd (php源码位置)/ext/gd
$ (php安装路径)/bin/phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && make install
 修改php.ini
添加extension=gd.so
 最后,重启php-fpm

追加:通过以上方法开启的gd库功能没有freetype功能……(php版本5.5.7)
网上找的教程不用重新编译开启后好像对数据库产生影响了,总之php可以用但是偶尔情况会报找不到文件的错
几经修改无效后决定重装php
官网上下载了php-5.5.14版,以下是编译参数:
./configure –prefix=/usr/local/php –enable-fastcgi –enable-fpm –with-fpm-conf=/etc/php-fpm.conf –with-config-file-scan-dir=/etc/php.d –with-openssl –with-zlib-dir=/usr/local/zlib/ –enable-bcmath –with-bz2 –with-curl –enable-ftp –with-gd=/usr/local/gd2/ –enable-gd-native-ttf –with-jpeg-dir=/usr/local/jpeg/ –with-png-dir=/usr/local/libpng/ –with-freetype-dir=/usr/local/freetype/ –with-gettext –with-mhash –enable-mbstring –enable-soap –enable-zip –with-iconv –with-mysql –with-mysqli –with-pdo-mysql -enable-mysqlnd –with-xpm-dir=/usr/lib64/
如果编译中遇到错误,可以搜索一下错误信息,一般是因为没有安装对应的软件造成的,比如curl、xml等
其中与gd库有关的 zlib gd2 freetype jpeg png 都是自行编译安装的,安装教程网上有很多,不一一赘述了

shell脚本中执行时提示“没有那个文件或目录”

lnmp环境shell脚本执行php文件,提示php文件为找到,在终端直接cd 发现文件存在。原因可能是脚本是在windows平台下写的,换行符与linux不同,造成脚本不能正确执行

故障现象:lnmp环境shell脚本执行php文件,提示php文件为找到,在终端直接cd 发现文件存在。原因可能是脚本是在windows平台下写的,换行符与linux不同,造成脚本不能正确执行 出现bad interpreter:No such file or directory的原因,是文件格式的问题。这个文件是在Windows下编写的。换行的方式与Unix不一样,但是在vim下面如果不Set一下又完全看不出来。

问题分析:

1、将windows 下编写好的SHELL文件,传到linux下执行,提示出错。

2、出错信息:bad interpreter: 没有那个文件或目录。

问题原因: 因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。脚本文件是DOS格式的 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A. 解决方法: 可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的

(1) vim filename 然后用命令 :set ff 可看到dos或unix的字样,如果的确是dos格式的, 那么用set ff=unix把它强制为unix格式的,,然后存盘退出后就可运行。

转换不同平台的文本文件格式可以用

1. unix2dos或dos2unix这两个小程序来做. 很简单. 在djgpp中这两个程序的名字叫dtou和utod, u代表unix, d代表dos

2. 也可以用sed 这样的工具来做: 复制代码 代码如下: sed ‘s/^M//’ filename > tmp_filename mv -f tmp_filename filename

特别说明:^M并不是按键shift + 6产生的^和字母M, 它是一个字符, 其ASCII是0x0D, 生成它的办法是先按CTRL+V, 然后再回车(或CTRL+M) 另外, 当SHELL程序报告command not found时, 总是去检查一下你的PATH里面有没有程序要用到的每一个命令(没指定绝对路径的那种). 你这么小的程序, 可以一行一行核对。

附:少写一个/引发的没有那个文件或目录问题 今天在翻看以前写的简单的shell脚本时,发现一个问题: 当./运行时总是提示: (bash: ./hello.sh: bin/bash: 坏的解释器: 没有那个文件或目录),但是当用sh运行时正确. 原来的脚本: (试试看你能否一眼看出错误) 复制代码 代码如下: #!bin/bash echo “Hello Linux!” 后来几番检查发现自己写的丢了一些东西. 应该把第一行改成 #!/bin/bash ,少写了一个/ 唉,很简单的问题,自己以前没有发现还有这样的错误! shell脚本的确好用,可唯一难的就是格式要求太高!

文章来源:http://www.jb51.net/article/48784.htm

mysql 无法远程操作

mysql 能够登陆成功,但是无法对表进行操作

Can’t create/write to file ‘/tmp/#sql_4ef4_0.MYI’ (Errcode: 13)

今天服务器上用yum安装的mysql远程登陆后无法对表进行操作,提示错误信息:

Can’t create/write to file ‘/tmp/#sql_4ef4_0.MYI’ (Errcode: 13)

看起来权限设置有问题。

执行如下命令:

cd /

chmod 1757 tmp

$_SERVER[‘PATH_INFO’] 获取不到报错

新搭建的web环境,使用kohana框架 地址重写后,报没有$_SERVER[‘PATH_INFO’] 的notice 错误,解决方案参考

一直以为是rewrite 出错了,没法获取到$_SERVER[‘PATH_INFO’]的值,对了apache的配置和.htaccess文件都没问题,
度娘没有得到理想的结果,于是自己想办法。
错误级别为notice错误,也就是说不是致命错误,查看php.ini 的error_reporting 配置,为E_ALL,就是会报所有的错误,
干脆注释掉
在测试,问题解决,我汗……