东东东 陈煜东的博客

分类存档: Linux ( 1 / 2)

进程不见了,Linux 的OOM Killer

背景

服务器的某个模块的进程莫名其妙的不见了,查看MQ的连接情况,该模块的连接数直接为0,但是其他模块的进程还存在。很是纳闷该模块的进程为什么进程突然不见了。

oom-killer-mq-consumer-connnection

查看进程的log文件,没有发现有stop信号收到。平时停止会收到kill信号。

[12:29:37.290]:[executor.py:_fun: 53]: Info: proc[28269] recv signal[15]
[12:29:37.314]:[mq.py:_consuming:181]: service received STOP signal, stop consume

一下子没有反应过来会被kill 9。想到平时大家都会去/var/log/message查看,打开文件一看:

Dec  2 10:10:00 localhost kernel: [53533657.927030] python invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0
Dec  2 10:10:00 localhost kernel: [53533657.927033] Pid: 19679, comm: python Not tainted  #1
Dec  2 10:10:00 localhost kernel: [53533657.927035] Call Trace:
Dec  2 10:10:00 localhost kernel: [53533657.927041]  [<ffffffff81089f9a>] oom_kill_process.clone.0+0xaa/0x270
Dec  2 10:10:00 localhost kernel: [53533657.927043]  [<ffffffff8108a278>] __out_of_memory+0x118/0x180
Dec  2 10:10:00 localhost kernel: [53533657.927045]  [<ffffffff8108a3ba>] out_of_memory+0xda/0x160
Dec  2 10:10:00 localhost kernel: [53533657.927048]  [<ffffffff8108e9cd>] __alloc_pages_nodemask+0x61d/0x630
Dec  2 10:10:00 localhost kernel: [53533657.927052]  [<ffffffff810b8ce3>] alloc_page_vma+0x93/0x150
Dec  2 10:10:00 localhost kernel: [53533657.927054]  [<ffffffff810af10e>] read_swap_cache_async+0xde/0x130
Dec  2 10:10:00 localhost kernel: [53533657.927061]  [<ffffffff810af868>] ? valid_swaphandles+0x68/0x160
Dec  2 10:10:00 localhost kernel: [53533657.927063]  [<ffffffff810af1df>] swapin_readahead+0x7f/0xb0
Dec  2 10:10:00 localhost kernel: [53533657.927067]  [<ffffffff810a09e2>] handle_mm_fault+0x392/0x9d0
Dec  2 10:10:00 localhost kernel: [53533657.927071]  [<ffffffff8102eaa0>] do_page_fault+0x110/0x2e0
Dec  2 10:10:00 localhost kernel: [53533657.927076]  [<ffffffff817de855>] page_fault+0x25/0x30
...
Dec  2 10:10:00 localhost kernel: [53533657.964521] Out of memory: kill process 21270 (python) score 1508 or a child
Dec  2 10:10:00 localhost kernel: [53533657.964523] Killed process 21360 (python)

原来是OOM,给杀死进程了。以为OOM会随便杀进程,之前也出现过一次,也是同一模块的进程都被杀了。于是上网搜索了一次OOM挑选进程的算法。

Linux 如何选择要kill掉的进程

从网上的找了一个比较全面的如下:

OOM Killer在内存耗尽时,会查看所有进程,并分别为每个进程计算分数。将信号发送给分数最高的进程。 
计算分数的方法 
在OOM Killer计算分数时要考虑很多方面。首先要针对每个进程确认下列1~9个事项再计算分数。 
1. 首先,计算分数时是以进程的虚拟内存大小为基准的,虚拟内存大小可以使用ps命令的VSZ或/proc/<PID>/status的 VmSize来确认。对于正在消耗虚拟内存的进程,其最初的得分较高,单位是将1KB作为1个得分,消耗1GB内存的进程,得分约为1024*1024。 
2. 如果进程正在执行swapoff系统调用,则得分设置为最大值(unsigned long的最大值)。这是因为禁用swap的行为与消除内存不足是相反的,会立刻将其作为OOM Killer的对象进程。 
3. 如果是母进程,则将所有子进程内存大小的一半作为分数。 
4. 根据进程的CPU使用时间和进程启动时间调整得分,这是因为在这里认为越是长时间运行或从事越多工作的进程越重要,需保持得分较低。 
5. 对于通过nice命令等将优先级设置得较低的进程,要将得分翻倍。nice-n中设置为1~19的命令的得分翻倍。 
6. 特权进程普遍较为重要,因此将其得分设置为1/4。 
7. 通过capset(3)等设置了功能(capability)CAP_SYS_RAWIO注3的进程,其得分为1/4,将直接对硬件进行操作的进程判断为重要进程。 
8. 关于Cgroup,如果进程只允许与促使OOM Killer运行的进程所允许的内存节点完全不同的内存节点,则其得分为1/8。 
9. 最后通过proc文件系统oom_adj的值调整得分。 

依据以上规则,为所有进程打分,向得分最高的进程发送信号SIGKILL(到Linux 2.6.10为止,在设置了功能CAP_SYS_RAWIO的情况下,发送SIGTERM,在没有设置的情况下,发送SIGKILL)。 
各进程的得分可以使用/proc/<PID>/oom_score来确认。 


来自: https://blog.csdn.net/JeffreyNicole/article/details/47263235 

上面的算法看着有点复杂,另外 Linux 的系统选择的策略不断在演进,还是得看正在用的版本的算法。

大概的算法的意思是:通过设置一些值来影响OOM killer做出决策。Linux下每个进程都有个OOM权重,在 /proc/<pid>/oom_adj里面,取值是-17+15,取值越高,越容易被干掉。

最终OOM killer是通过 /proc/<pid>/oom_score 这个值来决定哪个进程被干掉的。这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime – start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。

总之,总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少。 另外,Linux在计算进程的内存消耗的时候,会将子进程所耗内存的一半同时算到父进程中。

这也说明了,为什么有内存用的很多的模块,却没有被kill了,而是kill了一个cpu使用时间少的一个模块。因为内存大的模块,CPU的运行时间长,所以分数比较低。

top - 17:23:31 up 619 days, 21:41, ? users,  load average: 1.59, 1.88, 1.62
Tasks: 651 total,   1 running, 650 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.7%us,  1.6%sy,  0.0%ni, 74.5%id,  8.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  24738212k total, 24577344k used,   160868k free,     2068k buffers
Swap:  2097144k total,  2097144k used,        0k free,    79416k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
17880 root      20   0 1075m 895m 1632 S  0.0  3.7 123:55.47 python
17897 root      20   0 1076m 894m 1632 S  0.0  3.7 122:55.16 python
17840 root      20   0 1064m 893m 1632 S  0.0  3.7 125:09.59 python

/proc/$pid/oom_score_adj

The value of /proc/<pid>/oom_score_adj is added to the badness score before it
is used to determine which task to kill.  Acceptable values range from -1000
(OOM_SCORE_ADJ_MIN) to +1000 (OOM_SCORE_ADJ_MAX).  This allows userspace to
polarize the preference for oom killing either by always preferring a certain
task or completely disabling it.  The lowest possible value, -1000, is
equivalent to disabling oom killing entirely for that task since it will always
report a badness score of 0.

在计算最终的 badness score 时,会在计算结果是中加上 oom_score_adj ,这样用户就可以通过该在值来保护某个进程不被杀死或者每次都杀某个进程。其取值范围为-1000到1000 。

如果将该值设置为-1000,则进程永远不会被杀死,因为此时 badness score 永远返回0。

/proc/$pid/oom_adj

The value of /proc/<pid>/oom_score_adj is added to the badness score before it

For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also
be used to tune the badness score.  Its acceptable values range from -16
(OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17
(OOM_DISABLE) to disable oom killing entirely for that task.  Its value is
scaled linearly with /proc/<pid>/oom_score_adj.

该设置参数的存在是为了和旧版本的内核兼容。其设置范围为-17到15。从Linux 2.6.36开始都安装了/proc/<pid>/oom_score_adj,此后将替换掉/proc/<pid>/oom_adj。即使当前是对/proc/<pid>/oom_adj进行的设置,在内核内部进行变换后的值也是针对/proc/<pid>/oom_score_adj设置的。可以参见 feature-removal-schedule 这里 171行。

/proc/$pid/oom_score

This file can be used to check the current score used by the oom-killer is for
any given <pid>. Use it together with /proc/<pid>/oom_score_adj to tune which
process should be killed in an out-of-memory situation.

OOM killer机制主要根据该值和 /proc/<pid>/oom_score_adj 来决定杀死哪一个进程的。分数越高,越先被kill。

通过如下命令可以查看进程 oom_score 分数情况。最后一列是分数。

# ps -eo pid,command,pmem --sort -rss | awk '{"cat /proc/"$1"/oom_score" | getline oom; print $0"\t"oom}'
cat: /proc/PID/oom_score: No such file or directory
  PID COMMAND                     %MEM
 7663 python ./executor.py vsSche  2.2  794
 7675 python ./executor.py vsSche  2.1  683
 7671 python ./executor.py vsSche  2.1  780
 7811 python ./executor.py vsreso  0.1  1873
 7816 python ./executor.py vsreso  0.1  1877
 7465 python ./dispatcher.py host  0.1  15
 7540 python ./executor.py vnc_au  0.0  1914

其中有一个很低的进程才 15 分,看了下是一个常驻周期性的任务进程,执行的CPU时间非常长,所以算法把该进程的分数设置的非常低。 而经常被kill的进程分数有1900+分,所以这类进程老是被kill。

防止进程不被kill

通过上文说的,一般通过 /proc/<pid>/oom_score_adj设置一个很低的分数,例如 -1000 分永远不被杀死。

当系统认为进程都无法被杀死后,内核就会panic,然后整个机器挂了。

sigkill 信号无法被捕获

日志中记录了 SIGNTERM(15),但是在 SIGNKILL(9)时却没有打印,如果有一个 SIGNKILL 的信号,那么看日志的时候也会有一个更直观的线索。

两者区别:

  • SIGNKILL(9) 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。

  • SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

不过SIGKILL无法在进程里面被捕获。在Python中会直接跑出一个异常,所以无法打印这个信号。

>>> import signal
>>> def trycache(*args):
...     print args
...
>>> signal.signal(signal.SIGKILL,trycache)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: (22, 'Invalid argument')

阻止内存泄漏方法

很多程序会跑着跑着然后内存就泄漏了,然后内存就OOM。

特别的,像Python 虚拟机这样的程序,就申请了内存后,就不会释放内存给系统,会一直在虚拟机内部进行使用。那么对待这类程序的内存泄漏最好的方法是什么呢?

周期性reload进程。

是的,就是这么暴力,这么直接。

之前看 uWSGI里有个参数max-requests在处理了一定次数的请求后,会自动reload该进程。这样可以防止该进程的内存泄漏。

像平台类的软件,能做的就是在外部周期性reload进程。而业务的编写者,就得控制好自己进程的内存管理了。

不过要支持一个能reload进程的服务(注意不是restart),这个是一个要求需要比较高能力。幸好大部分的CGI进程都支持reload,例如nginx、php-fpm、uWSGI等。

而一个后台批量型任务,做到restart就行了,毕竟对进程重启对间隙不太敏感。做负载均衡的话,推荐用MQ可以推送给还能处理任务的进程。

自动补充进程

发现一些OOM的被kill的进程,比如 nslcd 进程,不断的被kill,但是会不断给补充进来。因此我们的进程管理设置,也需要增加一些进程自动补充,这样防止进程被oom几天都不知道。这样可以达到变相reload。

参考

关于python捕获内核发出的sigkill信号问题

https://learning-kernel.readthedocs.io/en/latest/mem-management.html

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 进程不见了,Linux 的OOM Killer – https://www.chenyudong.com/archives/linux-oom-killer.html

分类: Linux

rinetd – Linux tcp port forward

在寻找一个 Linux 的TCP 端口转发程序,大部分都是使用 iptables 来使用的,但我觉得 iptables 不是很好用,主要是不熟悉他的命令。

上网找了一个程序 rinetd,写个配置文件,可以后台运行,很简单。

下载地址:https://centos.pkgs.org/6/nux-misc-x86_64/rinetd-0.62-9.el6.nux.x86_64.rpm.html

教程 https://www.boutell.com/rinetd/

配置很简单vim /etc/rinetd.conf

# config rules


# 设置允许的请求来源
# allow 206.125.69.*

# 配置端口转发信息
# bindaddress bindport connectaddress connectport
0.0.0.0 23 206.125.69.81 23

service rinetd restart 重启一下服务。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: rinetd – Linux tcp port forward – https://www.chenyudong.com/archives/rinetd-linux-tcp-port-forward.html

分类: Linux 软件

ssh密钥登录失败

搞一个ssh的密钥登录,结果发现就是无法使用密钥登录,非让我输入密码。苦恼。

输入ssh连接代码

ssh -i private.key -v user@host.com -p22

从连接的信息中看不出有什么问题。

debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: publickey
debug1: Offering public key: private.key
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: password

已经提示说了,使用公钥登录,并且提供了私钥,但是还是提示让我输入密码。

但是我使用另外一个帐号去登录,发现是ok的,可以登录成功。我把成功的那个authorized_keys复制到我的那个用户名下,发现还是不能登录。但是验证了服务器的sshd功能是正常运行的,否则另外一个账户就没办法登录了。我觉得两个用户名的所在的环境应该是相同了,但是确实无法登录。

想到了客户端这里的连接没有更多有效的信息,那就想到了去服务器上看看相关的信息。vim /var/log/secure查看一下日志。发现有这么一段话:

Authentication refused: bad ownership or modes for directory /home/user/.ssh

上网搜了一下这个问题,发现原来是.ssh的目录权限不对,设置一下正确的权限:

chmod 700 ~/.ssh

在此过程中还学习到了一个sshd的测试模式。

 /usr/sbin/sshd -p 10022 -d
      -d     以调试模式运行。服务器将在前台运行并发送非常详细的调试日志信息,
             服务器将只允许接入一个连接,并且不派生出子进程。仅用于调试目的。
             使用多个 -d 选项可以输出更详细的调试信息(最多3个)。

会开启一个sshd的调试模式,新建一个10022端口,在客户端连接这个端口的时候,服务器端会有debug日志输出在屏幕上,这个时候就可以查看详细的信息。然后再针对信息进行解决。

总结

服务器用户对于ssh目录权限有一些权限要求,权限不对的话ssh无法工作,建议以下权限作为最小的权限。

chmod 700 .ssh          # chmod 755 .ssh 也是可以的
chmod 600 .ssh/authorized_keys
chmod 400 .ssh/private.key  #把密钥的权限也设置为最小

终于又可以愉快的编程了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: ssh密钥登录失败 – https://www.chenyudong.com/archives/ssh-public-key-authentication-refused.html

分类: Linux

wget下载http/https代理设置

如果你的Linux机器是在内网的,需要下载一个文件,在没办法直接访问外网的情况下就需要使用代理了。如果你需要搭建HTTP代理服务器,那么参考Squid搭建正向代理

使用wget命令可以设置http代理

wget http://www.baidu.com/ -e use_proxy=yes -e http_proxy=yourproxy.com:port

下载https的文件就要其他的额外参数了。

wget --no-check-certificate https://www.google.com/   \
 -e use_proxy=yes -e https_proxy=yourproxy.com:port   ##使用https_proxy才可以哟

参数--no-check-certificate可以不检查服务器的证书。

如果你觉得麻烦,可以对shell进行http proxy的代理设置:

export http_porxy=yourproxy.com:port
export https_proxy=yourproxy.com:port

这样其他的程序就可以通过这个代理进行网络访问了。

如果wget不需要代理可以使用参数--no-proxy取消代理。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: wget下载http/https代理设置 – https://www.chenyudong.com/archives/wget-http-proxy-setting.html

分类: Linux 软件

Linux ntpdate同步网络时间

自己的Linux服务器的时间和PC机上的时间不太对,打log的时间对不上,不太方便调式信息的判断,因此需要同步一下Linux服务器的时间和自己Windows的时间,两者一致,才方便调式的查看呢。

同步网络时间

在Linux下,我们可以使用ntpdate进行网络时间的同步,而不是我们自己去设置时间。这个命令的使用很简单,

ntpdate  0.cn.pool.ntp.org

另外网络时间同步和时区是不一样的。你可以选择任何一台网络时间同步服务器来同步你的时间,只要你的时区设置是对的,那么你的Linux上的时间就是对的。因为全球都是基于一个标准时间来约定的,美国人民与我们不同的是时区不同,经过换算,我们和他们的标准时间是一样的。

定时的同步时间

我们可以使用crontab来定时的同步时间

vim /etc/crontab
10 5 * * * root (/usr/sbin/ntpdate 0.cn.pool.ntp.org && /sbin/hwclock -w) &> /var/log/ntpdate.log 

每天的5点10分crontab运行一次命令,自动同步时间。

如果你具有多台的服务器,不要使用这个方法来定时的同步的你服务器,请使用ntpd来进行,这个还可以校准始终的问题。详情查看鸟哥

使用ntpdata造成的时间的越变还可能引发因某些依赖连续时间的程序的问题。一般第一次使用ntpdate,接下来使用ntpd服务来不断的调整时间。参见http://blog.sina.com.cn/s/blog_3f3422fd0100f06c.html

如何设置时区

将时区设置为东8区的时间,虽然服务器在全球的不同地方,但是我们人在中国,看着中国的时间比较有感觉。

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date
# Mon Mar 31 11:02:55 CST 2014

另外如果使用date命令查看时间,发现刚刚好相差8个小时或者其他的小时,那么应该就是你的时区设置不对,快快修改一下吧。

网络时间同步服务器列表

全球那么多的网络时间同步器,那么使用哪个好呢。我们知道数据在网络上流动是由延迟的,因此我们选择离我们服务器越近的服务器进行同步,时间越准。

时间服务器分为两种,一种是一级时间服务器,另外一种是二级时间服务器。我们如果是同步自己的服务器的时间,那么选择二级时间服务器,因为一级时间服务器是为二级时间服务器提供时间校对服务器,我们尽量不要增加一级服务器的压力。这种层级的概念和DNS的层级概念是一致的。

一级时间服务器列表:http://support.ntp.org/bin/view/Servers/StratumOneTimeServers

二级时间服务器列表:http://support.ntp.org/bin/view/Servers/StratumTwoTimeServers

附二级服务器列表:

  • 0.pool.ntp.org  有域名负载均衡
  • 0.cn.pool.ntp.org  有域名负载均衡
  • ntp.tuna.tsinghua.edu.cn 清华大学
  • time.windows.com    微软

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Linux ntpdate同步网络时间 – https://www.chenyudong.com/archives/linux-ntpdate-time-synchronize.html

分类: Linux

使用bash shell脚本编写简易的看门狗watch dog

发现有个定时上报的脚本,突然挂了,导致数据收集不到。查看了下,居然是数据库获得锁失败了。

单个脚本那边运行,肯定有风险存在,不知道之前的人怎么都没有注意到这个问题。为了解决这个问题,中午编写了一个看门狗的shell脚本,让其每隔固定的时间检查一下进程,如果没有发现进程就拉起来。否则就休眠一段时间。

看门狗shell脚本的编写

#!/bin/bash
now=`date '+%Y-%m-%d %H:%M:%S'`

grepFlag='grepDataReport'
thisLog='/data/report/watchlog'

baseDir="/data/report"
sleepTime=60

if [ ! -f "$baseDir/run.sh" ]; then
    echo "$baseDir/run.sh missing, check again" > "$thisLog"
    exit
fi

#user=`whoami`
user="root"
if [ "$user" != "root" ]; then
    echo "this tool must run as *root*"
    exit
fi

while [ 0 -lt 1 ]
do
    now=`date '+%Y-%m-%d %H:%M:%S'`
    ret=`ps aux | grep "$grepFlag" | grep -v grep | wc -l`
    if [ $ret -eq 0 ]; then
        cd $baseDir
        echo "$now process not exists ,restart process now... " > "$thisLog"
        ./run.sh
        echo "$now restart done ..... "  > "$thisLog"
        cd $curDir
    else
        echo "$now process exists , sleep $sleepTime seconds " > "$thisLog"
    fi
    sleep $sleepTime
done

在写这个脚本的时候,遇到了一些问题,主要是很久没有编写shell脚本了,有些忘记了。

在声明变量的时候 grepFlag = 'DataReport',提醒说命令不存在,原来是多了空格,生命变量必须紧邻=号才行。

多次启动一个程序。之前是因为变量没取到,获取不到进程。在if [ $ret -eq 0 ]里发现0,一直拉起进程,后来变换一下if分支的内容。使用判断如果进程查不到,就启动,如果启动多个,没有做处理。

在使用输出重定向的时候,我从 >> 改用为 > 。因为我觉得每次echo出来的文字都追加到一个文件里去,时间一长,这个文件会很大。于是我就直接改成覆盖,看最后一个消息是什么即可判断,还有查看文件的时间戳判断一下进程的情况。

后台运行程序run.sh的编写

后台的程序

nohup /usr/local/php/bin/php run.php grepDataReport &

注意这里一定要使用nohup。之前没有使用nohup,当终端没有关闭的时候,我kill了这个程序,会自动拉起,但是我退出终端,重新打开一个终端去kill后,发现无法拉起进程了。

注意使用nohup启动的时候,可能需要按一下按键,

nohup与&的区别

nohup是让命令忽略SIGHUP命令而已,退出终端后可以继续运行;&则让命令在后台运行,至于该命令是否能在退出终端后继续执行则要看进程是否是守护进程,如果不是,则需要nohup来帮忙。

nohup命令及其输出文件nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( nohang up)。

该命令的一般形式为:nohup command &使用nohup命令提交作业如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:nohup command > myout.file 2>&1 &在上面的例子中,输出被重定向到myout.file文件中。

PS.粗略看一下,发现shell脚本和python脚本感觉有些像,不用封号结尾,直接使用变量。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 使用bash shell脚本编写简易的看门狗watch dog – https://www.chenyudong.com/archives/bash-shell-watch-dog-auto-restart-process.html

分类: Linux

Linux永久改变hostname

Linux的hostname有时候有些作用,比如在shell中显示用户名@主机名

临时改变hostname

[root@localhost ~]# hostname # show current hostname
localhost.localdomain

[root@localhost ~]# hostname domain # change hostname
[root@localhost ~]# hostname
domain

永久改变hostname

[root@localhost ~]# vi /etc/hostname    # change
domain
[root@localhost ~]# exit

重新登录

[root@domain ~]# hostname
domain

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Linux永久改变hostname – https://www.chenyudong.com/archives/permanently-change-hostname-on-fedora-linux.html

分类: Linux

使用git同步管理自己的网站

在本地修改网站的文件,如果需要使用ftp上传,太麻烦,如果文件一多,也不知道哪个文件应该上传。而且网站使用了git作为项目管理,每个人都可以对网站进行更改,我如果改了,对方也改了,就不容易区分了。所以git的项目管理是很容易看出来哪里的文件发生变化的。

前面有说到使用通过SSH创建私有git仓库文章,此处在服务器上创建了一个公共的仓库,里面只是存放着文件的更改记录,没有一个文件结构直接显示在服务器的文件夹中。我们可以看本地的文件树,一个project里有.git文件夹,里面存放着更改记录。然后还有我们的具体的project的源代码。但是git服务器只存放着.git里的内容,没有本地的源代码结构。所以没办法直接更新网页。

但是有个方法,既然我们的git历史记录在服务器上保存着,而且我们可以从git仓库中check out出来源代码到服务器上,这样我们在本地push,然后在服务器上使用check out,就可以改变网页的文件了。

具体步骤。

在服务器上配置

第一步,新建一个git私有仓库test.git。可以参考文章http://www.chenyudong.com/archives/git-over-ssh-create-private-repository.html。

$ mkdir /home/www.chenyudong.com/www.chenyudong.com.git #将来网站git的记录存放位置
$ chown -R git:git www.chenyudong.com.git #改权限
$ cd www.chenyudong.com.git
$ git init --bare
Initialized empty Git repository in /home/www.chenyudong.com/www.chenyudong.com.git/

第二步,当客户端push到服务器来时,自动更新某个文件夹。

$ mkdir /home/www.chenyudong.com/WebRoot #网站的目录地址
$ vi hooks/post-receive #新建文件,输入以下内容
#!/bin/sh
GIT_WORK_TREE=/home/www.chenyudong.com/WebRoot git checkout -f
# or GIT_WORK_TREE=../WebRoot git checkout -f
$ chmod +x hooks/post-receive #添加可执行权限

post-receive这个脚本在提交文件到git仓库时,会运行文件内的代码,所以通过这样的方法,我们在客户端push提交代码后,就能自动更新网站的文件了。

在本地客户端配置

第一步,参考上边的文章,新建一个本地的仓库。

第二步,commit文件。

第三步,push文件到服务器上。在远端地址写入ssh://git@ca.daoiqi.com/~/www.chenyudong.com.git,然后输入密码,push后,就可以发现服务器下的那个文件夹发生变化了。

这样的方法,适用于php等解释性的语言,在运行时,直接靠解释器来编译运行。如果你是编写jsp页面,那么你提交的只有java文件和jsp文件,而运行的时class文件,那么就需要将java文件编译成class文件。只有在git服务器上,提交代码后,自动编译成class文件才行。我觉得可以使用ant来编译、胡或者写个bash程序。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 使用git同步管理自己的网站 – https://www.chenyudong.com/archives/git-sync-manage-website.html

分类: Linux

eclipse使用egit提交到github上

第一步,在系统上安装git,配置环境变量。下载一个Git for Windows的msysgit,我们下载一个PortableGit,我是64bit系统,我下载的PortableGit-1.8.0-preview20121022.7z,没出现什么问题。这个东西免安装,解压缩到目录下就好了。然后添加一下环境变量。

第二步,生成一个ssh 的公钥和私钥。教程可以查看https://help.github.com/articles/generating-ssh-keys#platform-windows。经过这个步骤后,产生id_rsa(私钥)和id_rsa.pub(公钥)。已经能和github通信了。

第三步,在github创建一个自己的Repository源仓库。

第四步,安装egit。

第五步,新建或者用已存在的project。右键project->team>commit,在本地创建一个仓库,并提交到本地。

第六步,提交到github。因为上一步已经在本地创建好一个仓库了,我们只要提交到github上就行。右键project->team->remote->push。在新窗口中,填写git@github.com:daoiqi/repo.git,其他默认就行了,点击Next,因为第一次提交,选择branch提交。

提交到github

这样,在github上就能看到这个project了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: eclipse使用egit提交到github上 – https://www.chenyudong.com/archives/egit-push-git-to-github-on-eclipse.html

分类: Linux

Linux tar zip命令解压缩文件使用

tar压缩

tar压缩目录

tar -zcvf dir.tar.gz dir/
-z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。
-x 从档案文件中释放文件。
-v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
-f 使用档案文件或设备,这个选项通常是必选的。

将dir目录压缩成一个文件为dir.tar.gz

tar排除特定目录

tar --exclude=dir/images/*  -zcvf dir.tar.gz dir/*

将dir目录下文件打包成dir.tar.gz,但不包括images目录下的文件。也就是打包dir/ 下的,dir/images/不要。

tar解压缩目录

tar -zxvf shell.tar.gz

tar 命令参数

-c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
-f 使用档案文件或设备,这个选项通常是必选的。
-r 把要存档的文件追加到档案文件的末尾。例如用户已经做好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。
-t 列出档案文件的内容,查看已经备份了哪些文件。
-u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
-x 从档案文件中释放文件。

zip解压缩

unzip aaa.zip

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Linux tar zip命令解压缩文件使用 – https://www.chenyudong.com/archives/linux-compress.html

分类: Linux

较早的文章

Copyright © 2018 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑