Linux 以普通用户自启动服务

Posted by wxianfeng Fri, 26 Oct 2012 18:52:00 GMT

linux 自启动服务 默认是以root启动的, 但是我们很多服务都是以普通用户启动的, 如果以root启动 , 这样会到来一些权限问题,例如应用中保存的文件等等.

以普通用户启动的核心指令如下:

su - user -f /path/shell

demo:

/etc/rc.local

[wxianfeng@li390-146 ~]$ cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

/bin/sh /usr/local/system/www/shell/linode/init_by_root.sh >> /usr/local/system/logs/init.log 2>&1
su - wxianfeng -f /usr/local/system/www/shell/linode/init_by_wxianfeng.sh >> /usr/local/system/logs/init.log 2>&1

init_by_root.sh 脚本

#!/bin/bash 

# nginx
/usr/local/system/nginx/sbin/nginx

# mysql
/etc/init.d/mysqld start

# svn
svnserve -d -r /usr/local/system/vcs

init_by_wxianfeng.sh 脚本

#!/bin/bash

source /usr/local/rvm/environments/ruby-1.9.2-p180

cd /usr/local/system/www/project_manager

thin start -e production -d -p 5000

source /usr/local/rvm/environments/ruby-1.8.7-p334 

thin start -C /etc/thin/thin.yml

thin 开机自启动

Posted by wxianfeng Sat, 21 Apr 2012 17:08:00 GMT

环境:
ubuntu server 10.04 + rvm + ruby 1.9.2 + rails 3.0.3

本来自启动是很简单的操作,可是今天为了让服务器上一个应用自启动,应用服务器用的是 thin, thin怎么也不能自启动,估计是rvm的问题,最后使用rvm wrapper解决了.

我以普通用户登录的ubuntu

安装 thin init.d 脚本

>sudo thin install

如果提示sudo thin 找不到 ,可以使用:

>rvmsudo thin install

这句命令实质在 /etc/init.d 下新建了 thin脚本

#!/bin/sh
### BEGIN INIT INFO
# Provides:          thin
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: thin initscript
# Description:       thin
### END INIT INFO

# Original author: Forrest Robertson

# Do NOT "set -e"

# DAEMON=/usr/local/rvm/gems/ruby-1.9.2-p318/bin/thin
DAEMON=/usr/local/rvm/bin/bootup_thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
        $DAEMON start --all $CONFIG_PATH
        ;;
  stop)
        $DAEMON stop --all $CONFIG_PATH
        ;;
  restart)
        $DAEMON restart --all $CONFIG_PATH
        ;;
  *)
        echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
        exit 3
        ;;
esac

:

设置 thin 开机自启动

>sudo update-rc.d -f thin defaults

然后把你的thin.yml配置文件放到 /etc/thin/ 下,看下我的:

wxianfeng@SNDA-192-168-2-15:~$ cat /etc/thin/thin.yml 
--- 
chdir: /data/projects/project_manager
environment: production
address: 0.0.0.0
port: 3000
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 512
require: []

wait: 30
servers: 6
daemonize: true
onebyone: true

就这么简单,发现 reboot 后,thin启动不起来 , 百思不得其解,

使用

>/etc/init.d/thin start

可以顺利启动

>service start thin

启动不了,提示找不到 thin,所以问题可能在这

于是google,最后找到了 rvm wrapper

我为我的项目使用了 rvm gemset , gemset名字为 huaianxinao

使用gemset

rvm @huaianxinao

生成wrapper

rvm wrapper ruby-1.9.3-p318@huaianxinao bootup thin

可以看到是生成了一个这样的可执行文件

/usr/local/rvm/bin/bootup_thin

于是把你的thin init.d 脚本的DAEMON修改为该路径

测试

>service thin start 

可以顺利启动,

>sudo reboot

thin 顺利自启动, OH YEAR O_O

最后看下 wrapper 原理,ls -l 看下 bootup_thin文件:

wxianfeng@SNDA-192-168-2-15:~$ ls -l /usr/local/rvm/bin/bootup_thin
lrwxrwxrwx 1 wxianfeng rvm 56 2012-04-21 17:29 /usr/local/rvm/bin/bootup_thin -> /usr/local/rvm/wrappers/ruby-1.9.2-p318@huaianxinao/thin

发现从gemset那ln -s 过来的,继续cat看下

wxianfeng@SNDA-192-168-2-15:~$ cat /usr/local/rvm/wrappers/ruby-1.9.2-p318@huaianxinao/thin
#!/usr/bin/env bash

if [[ -s "/usr/local/rvm/environments/ruby-1.9.2-p318@huaianxinao" ]]
then
  source "/usr/local/rvm/environments/ruby-1.9.2-p318@huaianxinao"
  exec thin "$@"
else
  echo "ERROR: Missing RVM environment file: '/usr/local/rvm/environments/ruby-1.9.2-p318@huaianxinao'" >&2
  exit 1
fi

发现source了这个文件 /usr/local/rvm/environments/ruby-1.9.2-p318@huaianxinao,cat 看下

wxianfeng@SNDA-192-168-2-15:~$ cat /usr/local/rvm/environments/ruby-1.9.2-p318@huaianxinao
export PATH ; PATH="/usr/local/rvm/gems/ruby-1.9.2-p318@huaianxinao/bin:/usr/local/rvm/gems/ruby-1.9.2-p318@global/bin:/usr/local/rvm/rubies/ruby-1.9.2-p318/bin:/usr/local/rvm/bin:$PATH"
export rvm_env_string ; rvm_env_string='ruby-1.9.2-p318@huaianxinao'
export rvm_path ; rvm_path='/usr/local/rvm'
export rvm_ruby_string ; rvm_ruby_string='ruby-1.9.2-p318'
export rvm_gemset_name ; rvm_gemset_name='huaianxinao'
export RUBY_VERSION ; RUBY_VERSION='ruby-1.9.2-p318'
export GEM_HOME ; GEM_HOME='/usr/local/rvm/gems/ruby-1.9.2-p318@huaianxinao'
export GEM_PATH ; GEM_PATH='/usr/local/rvm/gems/ruby-1.9.2-p318@huaianxinao:/usr/local/rvm/gems/ruby-1.9.2-p318@global'
export MY_RUBY_HOME ; MY_RUBY_HOME='/usr/local/rvm/rubies/ruby-1.9.2-p318'
export IRBRC ; IRBRC='/usr/local/rvm/rubies/ruby-1.9.2-p318/.irbrc'
unset MAGLEV_HOME
unset RBXOPT

发现设置了很多环境变量,所以找到问题了,你必须设置 rvm一系列的环境变量,才可以搞定!

SEE:
http://beginrescueend.com/integration/init-d/
http://stackoverflow.com/questions/3230404/rvm-and-thin-root-vs-local-user


capistrano 多机部署

Posted by wxianfeng Thu, 12 Apr 2012 03:39:00 GMT

核心使用 task 指令 实现多机部署

# encoding:utf-8
# >cap local deploy
# >cap remote deploy

set :application, "entos"
set :deploy_to, "/data/projects/entos"

set :scm, "git"
set :repository,  "git@114.255.155.167:entos.git"
set :branch, "master"
set :use_sudo, false
set :rails_env,"production"

task :remote do
  set :user, "entsea"
  set :deploy_via, :remote_cache
  set :copy_exclude, %w(external)
  server "114.255.155.166", :web, :app, :db, :primary => true
end

task :local do
  set :user, 'zzq'
  set :deploy_via, :remote_cache
  set :copy_exclude, %w(external)
  server '192.168.10.105', :web, :app, :db, :primary => true
end

namespace :deploy do
  task :start do; end
  task :stop do; end

  desc "Creating ln -s , example: database.yml"
  task :create_sync do
    run "ln -s #{shared_path}/config/database.yml #{current_path}/config/database.yml"
  end

  desc "Restarting unicorn"
  task :restart, :roles => :app, :except => { :no_release => true } do
    # run "/bin/sh restart_server.sh"
  end
end

after "deploy:symlink", "deploy:create_sync"

passenger 部署Rails项目后不写log

Posted by wxianfeng Mon, 24 Oct 2011 05:15:00 GMT

最近部署一个项目,采用的是centos + nginx+ passenger

发现rails project不打log, 是文件权限问题,passenger 规定文件权限不能是root ,如果你部署在ubuntu就不会有这个问题

passenger典型部署结构

lecai-
       |-- current
       |-- releases
       |-- shared

把根目录lecai的权限改了即可

>useradd deploy
>chown -R deploy:deploy lecai

shell 文件 插入行

Posted by wxianfeng Sun, 10 Jul 2011 22:44:00 GMT

一个rails2.x 的项目,需要迁移到rails3.x , ruby 1.9.2的编码问题,需要在rb文件头添加指定编码, 常见指定方式如下:

#coding:utf-8
#encoding:utf-8
# -*- coding: utf-8 -*-
# -*- encoding: utf-8 -*-

那么多rb文件总不能一个一个加吧,写个shell解决之!!!


linux 根据文件时间删除

Posted by wxianfeng Wed, 06 Jul 2011 04:57:00 GMT

capistrano 自动部署产生的releases下的版本太多了,没一次都有一个新的版本,足足有了 8G ,我的VPS 一共才16G , 把之前老的版本删除之:

capistrano产生的版本:

[root@li165-150 releases]# ll
total 24
drwxrwxr-x 19 root root 4096 Mar 10 12:31 20110310173127
drwxrwxr-x 19 root root 4096 Mar 31 05:08 20110331090836
drwxrwxr-x 19 root root 4096 Apr  1 10:14 20110401141405
drwxrwxr-x 19 root root 4096 Apr 30 02:25 20110430062446
drwxrwxr-x 19 root root 4096 May  9 07:18 20110509111749
drwxrwxr-x 19 root root 4096 Jul  6 12:20 20110706162030

删除shell:

>find . -type d -name "*"  -mtime +120  -maxdepth 1 | xargs rm -rf

-mtime +120 内容修改时间120 天前的
-maxdepth 1 不递归查找 

注意linux中文件的三个时间.

atime: access time, 访问时间, 例如使用 cat 查看文件, 该时间就会变

ctime: change time 状态修改时间, 例如使用 chown 修改文件权限, 该时间会变

mtime: modify time 内容最后修改时间 , 例如使用 vi 修改文件内容, 该时间会变

ls -lc filename         列出文件的 ctime
ls -lu filename         列出文件的 atime
ls -lt filename          列出文件的 mtime

例如常用的 ls -lrt 就是把最后修改的文件排序到最后

[wxianfeng@li390-146 log]$ ls -lrt
total 302024
-rw-r--r-- 1 root      root         916417 Aug 16  2012 thin.3002.log
-rw-r--r-- 1 root      root        1106175 Aug 17  2012 thin.3001.log
-rw-r--r-- 1 root      root        1414256 Aug 17  2012 thin.3000.log
-rw-rw-rw- 1 wxianfeng wxianfeng 295914200 May  2 23:58 production_2013-04-17.log.20130502
-rw-rw-rw- 1 wxianfeng wxianfeng   9588147 May  3 01:52 production_2013-04-17.log

ssh 不输入密码连接服务器

Posted by wxianfeng Thu, 14 Apr 2011 17:39:00 GMT

环境:ubuntu10.10(client) + Centos 5.5 (server)

每次ssh连接服务器 ,scp 拷贝东西 , 或者rsync同步 ,都要输入密码验证,很麻烦,把publickey传到server上的 authorized_keys 中即可 ,建立信任后就不需要输入密码了

1,生成publickey

>ssh-keygen -t rsa # 或者用 dsa 加密

2,上传 publickey 文件到server

>scp  ~/.ssh/id_dsa.pub root@173.230.155.150:~/.ssh/authorized_keys # 173.230.155.150  换成你server的ip

3,ok了

======

本地普通用户免密码连接服务器上的普通用户
把服务器上的 authorized_keys 变为 600权限,.ssh 目录和用户主目录变为 700 / 755 权限

[entsea@www .ssh]$ ll
total 16
-rw-------. 1 entsea entsea  404 May 19 02:50 authorized_keys

=========

ssh时候直接写host连接,不写username配置

localhost:.ssh wangxianfeng$ cat ~/.ssh/config 
Host www.wxianfeng.com
    user wxianfeng

>ssh www.wxianfeng.com

http://liluo.org/2011/05/%E8%AE%BE%E7%BD%AE-ssh-%E8%87%AA%E5%8A%A8%E7%99%BB%E9%99%86%EF%BC%88%E5%85%8D%E5%AF%86%E7%A0%81%EF%BC%8C%E7%94%A8%E6%88%B7%E5%90%8D%EF%BC%89/
http://topic.csdn.net/u/20110701/12/2519a5cc-77d3-4fda-b2d0-88c62edd2556.html


小心 linode 的流量

Posted by wxianfeng Wed, 09 Mar 2011 00:07:00 GMT

linode 真是让人火大,没有任何通知的情况下,扣除了我信用卡 40 usd ,但是事出有因

因为我超过每个月200G流量了,前几天一直收到 linode 的报警邮件,说我的 VPS 流量比较大 超过了了 平均 5M/s, 但是没有提示超流量的后果. 看看我的 blog 能正常访问 ,也就没管它,后来被扣了 40 美元,真让人火大,FUCK LINODE!,越来越讨厌linode了,随便举几个例子:

1,时常会停电
2,ip偶尔被和谐
3,后台 经常session error 和 硬盘使用量 始终显示100%


4,,价格 偏贵
5,超流量 扣费非常严重
6,….

为什么流量这么大,这个可能是大家关心的

我用iftop实时监控流量,发现 下行流量最高达到 20M/s 确实吓人,下图:

linode 后台也可以看出:

由于个人运维经验有限,没发现什么,只发现了 连到我 80 端口nginx 上的ip数很多,下图:

我把nginx 重启了 ,重启后 还是很多 ,流量依然很大,后来我没办法就 关机了 ,隔了一天后 重启了 机器 ,系统正常了 。。。目前还是不知道 解决办法!

最后看下我这两天被扣的钱,你就知道 超过流量 有多么 惨了

让全球人 都来 fuck linode吧!摸下面网址:

fucklinode!!!


Heroku Permission denied (publickey)

Posted by wxianfeng Mon, 07 Mar 2011 18:57:00 GMT

今天 push project 到 heroku ,可是怎么都出现下面这个错误:

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

不解,push 到github 就没有问题, 网上搜了下 说是 publickey 问题 , 可是看了 heroku 上 和本地的 就是一样的 。。

wxianfeng@ubuntu:/usr/local/system/projects/git/fucklinode$ heroku keys
=== 1 key for wang.fl1429@gmail.com
ssh-dss AAAAB3NzaC...ZALatGdA== wang.fl1429@gmail.com

本地的

~/.ssh/id_rsa.pub 也是这个key

如果发现不一样的 可以 添加一个新的 key

>heroku keys:add  ~/.ssh/id_rsa.pub

更多关于keys的命令可以

>heroku help

继续研究,后来发现 heroku 找的 不是 id_rsa.pub ,而是 id_dsa.pub ,通过 ssh -v git@heroku.com 查出

>ssh -v git@heroku.com 
...
debug1: Trying private key: /home/wxianfeng/.ssh/id_dsa
...

好 , 那我就给你生成 dsa 加密的

>cd ~/.ssh
>rm -rf  *
>ssh-keygen -C "wang.fl1429@gmail.com" -t dsa   # rsa 加密的 -t rsa 即可

上传 key

>heroku keys:add ~/.ssh/id_dsa.pub

>git push heroku master 

就ok了

按照官方的教程 就应该是 id_rsa.pub , 之前也一直好好的,可是 今天 找的怎么是 id_dsa.pub 呢 , 如果你同样遇到这个问题,看看是不是 也是这里的问题 ….

SEE:
http://stackoverflow.com/questions/3481973/heroku-error-permission-denied-public-key
http://devcenter.heroku.com/articles/quickstart
http://help.github.com/troubleshooting-ssh/


Linux 服务器流量监控iftop

Posted by wxianfeng Thu, 03 Mar 2011 02:37:00 GMT

环境:centos5.5 + ubuntu 10.10

最近我的VPS的流量超级大,平均达到了 5m/s , 不知道怎么回事 ,怎么流量这么大 ,最后找到了一个不错的工具 iftop 监控流量

和 top 命令相似,很实用,很方便

1,安装

ubuntu:

>sudo  apt-get install iftop

centos:

yum install flex byacc  libpcap ncurses ncurses-devel
wget ftp://fr2.rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/iftop-0.17-1.el5.rf.i386.rpm
rpm -ivh iftop-0.17-1.el5.rf.i386.rpm

2,使用

>iftop

3,查看帮助

iftop 后 ? 查看

4,截图

更详细的摸下面网址:
http://www.vpser.net/manage/iftop.html