标签 ubuntu 下的文章

写了一个头条爬虫,放到服务器上使用crontab定时采集头条文章,服务器系统是Ubuntu 16.04 LTS,一开始设置的是间隔4小时采集一次,运行起来很正常,不过一到下午4点采集任务跑起来就超级超级慢,后来就改成离散的时间点采集,跑了两天发现,crontab定时任务执行的时间与系统时间不一致,总是差了8个小时,而不是在设置的时间点执行,查看系统时区,是北京时间呀,怎么会不一样,不过时间差总是8个小时,估计应该是crontab的时区跟系统的时区不一样,重启一下cron服务

sudo service cron restart

又跑了两天,发现执行时间正常了,按照设置的时间点执行了,看来问题就是系统时区的配置晚于cron服务启动的时间,也就是系统时区改动后未重启cron服务!

在VPS上用pip安装一个python包时,直接提示Killed退出了

#Output
Installing collected packages: pypinyin
Killed

无法安装,好奇怪,别的包都安装上了,就这个出问题,在stackoverflow搜到一个问答,https://stackoverflow.com/questions/43245196/pip-install-killed ,貌似是内存不足导致的。

按照问答里说的,查看Linux kernel日志

tail -f /var/log/kern.log
#Output
Out of memory: Kill process 18741 (pip) score 251 or sacrifice child
Killed process 18741 (pip) total-vm:178620kB, anon-rss:121956kB, file-rss:2996kB

看来确实是内存不足,Out of memory,然后直接被系统kill掉了。

内存不够,增加swap交换分区,正好vps用的是Ubuntu系统,直接参照这篇文章 https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04

Ubuntu添加Swap分区

查看系统是否有Swap分区

sudo swapon --show

如果没有任何输出,表示没有swap分区,也可以通过free命令验证一下

free -h
#Output
              total        used        free      shared  buff/cache   available
Mem:            486         316          81           5          88         132
Swap:             0           0           0

可以看到Swap的大小是零,也就是没有swap分区。

创建Swap分区文件

创建一个1G大小的文件作为交换分区的文件

sudo fallocate -l 1G /swapfile

设置这个文件权限

sudo chmod 600 /swapfile

格式化为交换分区文件

sudo mkswap /swapfile

启用交换分区文件

sudo swapon /swapfile

验证一下swap分区文件是否创建成功

sudo swapon --show
#Output
NAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -1

设置开机时自启用Swap分区

备份/etc/fstab文件,防止出错

sudo cp /etc/fstab /etc/fstab.bak

输入下面的命令在/etc/fstab文件添加一行swap文件的信息

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

优化Swap设置

调整Swappiness值

sudo sysctl vm.swappiness=10
#Output
vm.swappiness = 10

调整Cache Pressure值

sudo sysctl vm.vfs_cache_pressure=50
#Output
vm.vfs_cache_pressure = 50

设置开机时自动调整这两项设置值
/etc/sysctl.conf文件最后添加下面两行内容

vm.swappiness=10
vm.vfs_cache_pressure=50

OK,搞定,测试一下看pip是否能安装这个包了,哈哈,不再是Killed,变成了Successfully installed,没有问题,成功安装。

#Output
Installing collected packages: pypinyin
Successfully installed pypinyin-0.33.0

搞一个aws账号,创建了一个ec2,用的ubuntu镜像,不过发现ec2不能直接用账号密码登录,需要用证书登录,好吧,那就用证书登录吧

putty

putty->Connection->Auth->Private key file for authentication 里选择在aws下载的私钥证书 xxx.pem, 然后登陆,结果提示如下错误:

Unable to use key file "xxx.pem" (OpenSSH SSH-2 private key)

What? 不能使用OpenSSH SSH-2 private key,密钥有问题?什么情况?好吧,没用过证书登录,以前都是直接用账号密码登录的,这有点尴尬,搜了一下,貌似是OpenSSH私钥与putty使用的私钥格式有点不一样,需要转换一下,好吧,去 https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 这里下载一个puttygen.exe

puttygen

puttygen->Conversions->Import Key->Save private key 里把在aws下载的私钥证书 xxx.pem 转换为 xxx.ppk,再用putty尝试登陆,结果提示如下:

Please login as the user "ubuntu" rather than the user "root".

好吧,这镜像还是默认禁用root的,那就用ubuntu登陆吧,OK,登陆成功,这,虽说用证书是免密登陆,不过这一顿操作,反正也是测试服务器,还是改成账号密码登录吧

编辑 /etc/ssh/sshd_config
sudo vim /etc/ssh/sshd_config

修改 PermitRootLogin prohibit-passwordPermitRootLogin yes
这是设置允许root登陆

修改 PasswordAuthentication noPasswordAuthentication yes
这是设置允许使用账号密码登录

保存退出并重启ssh服务
sudo service ssh restart

哦对,还差一步,要重置root的密码

sudo passwd root

OK,现在就可以直接使用账号密码登录,也可以使用root账号直接登陆了。