Screen: Linux会话管理

SSH会话

一般我们通过SSH连接服务器,通常情况下,只能开启一个会话.也就是单线程,如果想要管理多个会话或者在网络掉线之后依然想让服务器继续执行命令,则可以借助screen工具.

安装

在Centos中,使用下面的命令安装screen:

yum -y install screen

fedora31发布
image-2836

常用命令

安装成功之后,可以通过以下命令来进行常用操作.

创建一个会话:

screen -S screenName

命令运行完成之后,就已经进入会话了.screenName是会话名称,可以自定义.

查看所有会话:

screen -ls

列表会显示已经创建的会话和状态.

重新进入一个会话:

screen -r screenName

关闭一个会话:

在关闭一个会话前,需要先获取到会话的ID,方式如下:

screen -ls
There are screens on:
        60695.abc       (Attached)
        60746.def       (Attached)
2 Sockets in /var/run/screen/S-root.

通过上面运行screen -ls,可以获取到def的id是60746.假如需要关闭def,则执行下面的命令即可:

screen -X -S 60746 quit

之后再次运行screen -ls会发现def这个名称的会话已经被关闭了.

Screen的官方文档在这里: https://www.gnu.org/software/screen/manual/

Fedora 31:运行Docker遇到的问题

image-2822
docker

错误详情

docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused “process_linux.go:297: applying cgroup configuration for process caused \”open /sys/fs/cgroup/docker/cpuset.cpus.effective: no such file or directory\””: unknown.

fedora31发布
image-2823

问题导致

在Fedora 31中默认开启了cgroups V2,Docker还没有支持这个版本.但对cgroups V2的支持正在开发中,估计后续版本会支持.

解决办法

在Fedora 31中禁用cgroups V2即可.

执行下面的语句会重启系统,请注意提前保存数据及相关工作进度!

sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo reboot

解决办法参考自: https://github.com/docker/cli/issues/297#issuecomment-547022631

Fedora:Fedora 31发布

Fedora 31发布了

更新内容,参考: https://www.oschina.net/news/110941/announcing-fedora-31

fedora31发布
image-2718

Fedora 31安装/升级方式

1. 升级

升级前,先备份数据!

升级步骤参考:

  1. dnf upgrade --refresh
  2. dnf install dnf-plugin-system-upgrade
  3. dnf system-upgrade download --refresh --releasever=31
  4. rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-31-primary
  5. dnf system-upgrade reboot

升级具体参考: https://docs.fedoraproject.org/en-US/quick-docs/dnf-system-upgrade/

安装

请参考:

https://docs.fedoraproject.org/en-US/quick-docs/creating-and-using-a-live-installation-image/

Linux:配置SSL遇到的问题

问题是这样的

环境:Centos,Flask,Let’s Encrypt.

使用下面的方式,来安装SSL,发现在Wordpress程序上没有任何问题,而在安装Flask程序时,则出现了问题。具体往下看。

在Flask程序上申请SSL证书,出现下面的提示:

Failed authorization procedure.
The following errors were reported by the server

内容来自:https://www.freehao123.com/lets-encrypt/

问题已经解决了,用的是Certbot,我把我的方法贴一下:
首先要说明一下几点:
1.存在一个已经建立的虚拟主机
2.我用的是oneinstack
3.Python的版本是2.7以下(如果是2.7以上SSL证书会自动安装,不用手动的)
4.使用Certbot脚本
————-分界线————————————–
过程:
1.去Certbot的官网找到与web环境相应的脚本(官网qi姐已经贴出来了)
2.按照官网的步骤来:(这是CentOS6 ,Nginx的脚本,不要直接复制哦,要按照自己的情况来)
# wget https://dl.eff.org/certbot-auto
# chmod a+x certbot-auto
$ ./certbot-auto
——————-分界线———————–
然后Python版本低于2.7的服务器就会出现问题了
Certbot会报错,代码如下:
Installing Python packages…
Installation succeeded.
/root/.local/share/letsencrypt/lib/python2.6/site-packages/cryptography/__init__.py:26: DeprecationWarning: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of cryptography will drop support for Python 2.6
DeprecationWarning
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Failed to find apachectl in PATH: /usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
/root/.local/share/letsencrypt/lib/python2.6/site-packages/certbot/main.py:568: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
return e.message
Certbot doesn’t know how to automatically configure the web server on this system. However, it can still get a certificate for you. Please run “certbot-auto certonly” to do so. You’ll need to manually configure your web server to use the resulting certificate.
——————-分界线————————–
我们不用管它,因为他说了,你可以手动安装SSL,那我们就手动安装
——————-分界线——————————
输入命令:
# ./certbot-auto certonly
然后它依旧会报错,那我们依旧不管他
继续进行命令,因为我们是手动配置
——————–分界线——————————–
再输入上面的命令以后,会出现选项,一个是独立服务器,一个是web服务
我们选择1,web服务
它会要求我们输入email(可以不输入),那我们输入email
———————–分界线—————————–
接下来它会要求我们输入域名
输入域名
————————分界线—————————
然后它会要求我们给出域名所在的根目录
用的oneinstack的话就输入
/data/wwwroot/你的域名
————————-分界线———————–
返回如下代码,获得SSL 证书:
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/ex.acgbuster.com/fullchain.pem. Your cert
will expire on 2017-05-02. To obtain a new or tweaked version of
this certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
“certbot-auto renew”
– If you like Certbot, please consider supporting our work by: 
 
Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF:
————————–分界线——————————-

众所周知,Flask的目录结构是:

Flask项目目录结构

在使用

./certbot-auto certonly

命令之后,如果输入的是/flaskxxx这个目录,那么就会生成红色框内的目录(Let’s Encrypt会在网站根目录生成一个目录里面会放一个验证程序[类似于验证文件],随后程序会进行访问相关地址进行匹配),用过Flask的都知道,这个红色的目录肯定是不对的(Flask一般读取templates目录下面的文件)。

所以,在Flask上申请SSL的时候,就遇到了这个问题。

我们只能从侧面去解决这个问题。

Linux+Nginx+PHP+MySQL

解决方案

在你的Flask文件中加入下面的代码,然后再次执行

./certbot-auto certonly

就可以实现验证,也就可以申请到SSL证书了。

2017.5.15更新:当文件不存在时,不显示详细路径(加入try/except处理).

from flask import make_response
import os

@app.route('/.well-known/acme-challenge/<checkinfo>')
def checkSSL(checkinfo):
    base_dir = os.path.dirname(__file__)
    checkinfo = 'templates/.well-known/acme-challenge/'+checkinfo
    try:
        resp = make_response(open(os.path.join(base_dir,checkinfo)).read())
        return resp
    except IOError as err:
        return 'File Error'
    return 'hi'

修改Python文件之后,如果使用的是uwsgi+nginx架构,只需要重启uwsgi即可.

ps -ef | grep uwsgi
root      9977     1  0 19:41 ?        00:00:00 uwsgi -x xxx.xml -d uwsgi.log --pidfile /tmp/uwsgi.pid
kill -9 9977
# 9977 是程序的进程号.
# 在下面再次运行uwsgi即可.

折腾一下午这个问题……

另外,下午将目前的几个站全都升级了SSL。只是遗憾的是,国内的淘宝联盟不支持SSL,代码只能显示空白了。(百度统计,CNZZ都支持SSL,而51LA目前还不支持SSL),还好GG支持SSL,直接就可以用了。

Python:清除文件内容

问题

在Linux或者Windows服务器下面(当然,个人电脑可能也存在此问题),有时候系统运行时间长了,会存在很多日志文件(或者其它缓存文件)。而这些文件,可能在不同的目录中。当然,这时,也可以直接删除相关日志文件和目录,那么这样会导致一个问题——程序可能会因为找不到日志目录而报错。因此,想到一个更简单的办法:

只清除指定目录下面的所有文件的内容(但还是要注意配置目录,数据无价),而不对目录、文件进行删改(只清除文件内容)操作。

python Logo

源码

**********数据无价,请谨慎操作*********
*********针对程序的使用,不承担任何责任***********

请注意以下几点:

  1. 程序需要配置需要清除的目录(请谨慎配置)、日志文件(默认当前目录)地址
  2. 程序基于Python3(我使用Python3.6)
  3. 程序提供日志功能,可自行修改相关代码配置格式.

源码如下:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import os
from pathlib import Path
from datetime import datetime,timedelta
import time
import io

'''

-- 数据无价,请谨慎使用.

Python3 清空文件内容.

主要用于:清除服务器或网站的日志文件.
此程序不会执行任何删除操作,但会清除数据日志记录.

程序自带日志记录.
默认日志记录在当前文件夹下面.

-- 请谨慎使用.

author:prd.
date:2017-02-17 v0.1
Python Version:3.6

'''

def formatDateToStr(dateTimeValue=datetime.now(),formatv='%Y-%m-%d %H:%M:%S'):
        return dateTimeValue.strftime(formatv)

if __name__ == '__main__':
	print("先配置在使用.*********数据无价,谨慎操作**********")
	exit(0)
	# 日志文件名称,默认当前目录
	logPath = "delloginfo.log"
	'''

	数据无价,谨慎操作

	*:配置需要清除的目录,可配置多个.

	'''
	pathList =["/var/log"]
	delFileLog = []
	for path in pathList:
		for root, dirs, files in os.walk(path, topdown=False):
			for name in files:
				delFileLog.append('[{0}]&&[{1}]  clear file content.\n'.format(formatDateToStr(),os.path.join(root,name)))
				p = Path(os.path.join(root, name))
				p.write_text('')
	logW = Path(logPath)
	# 如果日志文件不存在,则新创建.
	if not logW.exists():
		logW.touch()
	# 日志文件大小.
	# 单位为整数M.
	logFileSize = logW.stat().st_size//1024//1024
	if logFileSize>=5:
		# 当日志文件大小超过5M时,清空日志文件内容.
		# 之后在写入.
		logW.write_text('')
	# 记录日志文件数据.
	with logW.open(mode='a') as f:
		f.write(''.join(delFileLog))

Linux 定时任务参考:

5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,

以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]

30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]

25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]

*/15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]

30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ]

每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件

50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]