庞国明-博客

此心用度八千遍,不曾厌倦


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

opencv+python-图片文本倾斜校正

发表于 2019-01-10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

# -*- coding: UTF-8 -*-

import numpy as np
import cv2

## 图片旋转
def rotate_bound(image, angle):
#获取宽高
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)

# 提取旋转矩阵 sin cos
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])

# 计算图像的新边界尺寸
nW = int((h * sin) + (w * cos))
# nH = int((h * cos) + (w * sin))
nH = h

# 调整旋转矩阵
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY

return cv2.warpAffine(image, M, (nW, nH),flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

## 获取图片旋转角度
def get_minAreaRect(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.bitwise_not(gray)
thresh = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
coords = np.column_stack(np.where(thresh > 0))
return cv2.minAreaRect(coords)

image_path = "54321.png"
image = cv2.imread(image_path)
angle = get_minAreaRect(image)[-1]
rotated = rotate_bound(image, angle)

cv2.putText(rotated, "angle: {:.2f} ".format(angle),
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

# show the output image
print("[INFO] angle: {:.3f}".format(angle))
cv2.imshow("imput", image)
cv2.imshow("output", rotated)
cv2.waitKey(0)

可矫正所有 图片格式包括 png jpg tif等

centos cron 自动执行脚本异常 命令不生效的解决办法

发表于 2019-01-10

办法:

1、sh脚本加入 source /etc/profile

2、非系统命令,要写绝对路径

Java后端WebSocket的Tomcat实现

发表于 2019-01-08

一.WebSocket简单介绍

随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。

我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应 用。在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:轮询(polling)和Comet技术。其实后者本质上也是一种轮询,只不过有所改进。

轮询是最原始的实现实时Web应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。

Comet技术又可以分为长轮询和流技术。长轮询改进了上述的轮询技术,减小了无用的请求。它会为某些数据设定过期时间,当数据过期后才会向服务端发送请求;这种机制适合数据的改动不是特别频繁的情况。流技术通常是指客户端使用一个隐藏的窗口与服务端建立一个HTTP长连接,服务端会不断更新连接状态以保持HTTP长连接存活;这样的话,服务端就可以通过这条长连接主动将数据发送给客户端;流技术在大并发环境下,可能会考验到服务端的性能。

这两种技术都是基于请求-应答模式,都不算是真正意义上的实时技术;它们的每一次请求、应答,都浪费了一定流量在相同的头部信息上,并且开发复杂度也较大。

伴随着HTML5推出的WebSocket,真正实现了Web的实时通信,使B/S模式具备了C/S模式的实时通信能力。WebSocket的工作流程是这 样的:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 TCP连接传输数据。因为WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询和Comet技术小 了很多。本文不详细地介绍WebSocket规范,主要介绍下WebSocket在Java Web中的实现。

JavaEE 7中出了JSR-356:Java API for WebSocket规范。不少Web容器,如Tomcat,Nginx,Jetty等都支持WebSocket。Tomcat从7.0.27开始支持 WebSocket,从7.0.47开始支持JSR-356,下面的Demo代码也是需要部署在Tomcat7.0.47以上的版本才能运行。

二.WebSocket示例

2.1.新建JavaWeb测试项目

在pom.xml中添加Jar包依赖

1
2
3
4
5
6
1 <dependency>
2 <groupId>javax</groupId>
3 <artifactId>javaee-api</artifactId>
4 <version>7.0</version>
5 <scope>provided</scope>
6 </dependency>

客户端(Web主页)代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 1 <%@ page language="java" pageEncoding="UTF-8" %>
2 <!DOCTYPE html>
3 <html>
4 <head>
5 <title>Java后端WebSocket的Tomcat实现</title>
6 </head>
7 <body>
8 Welcome<br/><input id="text" type="text"/>
9 <button onclick="send()">发送消息</button>
10 <hr/>
11 <button onclick="closeWebSocket()">关闭WebSocket连接</button>
12 <hr/>
13 <div id="message"></div>
14 </body>
15
16 <script type="text/javascript">
17 var websocket = null;
18 //判断当前浏览器是否支持WebSocket
19 if ('WebSocket' in window) {
20 websocket = new WebSocket("ws://localhost:8080/websocket");
21 }
22 else {
23 alert('当前浏览器 Not support websocket')
24 }
25
26 //连接发生错误的回调方法
27 websocket.onerror = function () {
28 setMessageInnerHTML("WebSocket连接发生错误");
29 };
30
31 //连接成功建立的回调方法
32 websocket.onopen = function () {
33 setMessageInnerHTML("WebSocket连接成功");
34 }
35
36 //接收到消息的回调方法
37 websocket.onmessage = function (event) {
38 setMessageInnerHTML(event.data);
39 }
40
41 //连接关闭的回调方法
42 websocket.onclose = function () {
43 setMessageInnerHTML("WebSocket连接关闭");
44 }
45
46 //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
47 window.onbeforeunload = function () {
48 closeWebSocket();
49 }
50
51 //将消息显示在网页上
52 function setMessageInnerHTML(innerHTML) {
53 document.getElementById('message').innerHTML += innerHTML + '<br/>';
54 }
55
56 //关闭WebSocket连接
57 function closeWebSocket() {
58 websocket.close();
59 }
60
61 //发送消息
62 function send() {
63 var message = document.getElementById('text').value;
64 websocket.send(message);
65 }
66 </script>
67 </html>

Java Web后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 1 package me.gacl.websocket;
2
3 import java.io.IOException;
4 import java.util.concurrent.CopyOnWriteArraySet;
5
6 import javax.websocket.*;
7 import javax.websocket.server.ServerEndpoint;
8
9 /**
10 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
11 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
12 */
13 @ServerEndpoint("/websocket")
14 public class WebSocketTest {
15 //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
16 private static int onlineCount = 0;
17
18 //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
19 private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>();
20
21 //与某个客户端的连接会话,需要通过它来给客户端发送数据
22 private Session session;
23
24 /**
25 * 连接建立成功调用的方法
26 * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
27 */
28 @OnOpen
29 public void onOpen(Session session){
30 this.session = session;
31 webSocketSet.add(this); //加入set中
32 addOnlineCount(); //在线数加1
33 System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
34 }
35
36 /**
37 * 连接关闭调用的方法
38 */
39 @OnClose
40 public void onClose(){
41 webSocketSet.remove(this); //从set中删除
42 subOnlineCount(); //在线数减1
43 System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
44 }
45
46 /**
47 * 收到客户端消息后调用的方法
48 * @param message 客户端发送过来的消息
49 * @param session 可选的参数
50 */
51 @OnMessage
52 public void onMessage(String message, Session session) {
53 System.out.println("来自客户端的消息:" + message);
54 //群发消息
55 for(WebSocketTest item: webSocketSet){
56 try {
57 item.sendMessage(message);
58 } catch (IOException e) {
59 e.printStackTrace();
60 continue;
61 }
62 }
63 }
64
65 /**
66 * 发生错误时调用
67 * @param session
68 * @param error
69 */
70 @OnError
71 public void onError(Session session, Throwable error){
72 System.out.println("发生错误");
73 error.printStackTrace();
74 }
75
76 /**
77 * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
78 * @param message
79 * @throws IOException
80 */
81 public void sendMessage(String message) throws IOException{
82 this.session.getBasicRemote().sendText(message);
83 //this.session.getAsyncRemote().sendText(message);
84 }
85
86 public static synchronized int getOnlineCount() {
87 return onlineCount;
88 }
89
90 public static synchronized void addOnlineCount() {
91 WebSocketTest.onlineCount++;
92 }
93
94 public static synchronized void subOnlineCount() {
95 WebSocketTest.onlineCount--;
96 }
97 }

1.2.运行效果

同时打开Google浏览器和火狐浏览器进行多客户端模拟测试,运行效果如下:

该Demo在Jdk1.7+Tomcat7.0.65下环境测试过,示例项目代码下载

本篇博客的大部分内容转载自http://blog.chenzuhuang.com/archive/28.html,然后在此基础上进行完善,在此对作者表示感谢.

HTML5新特性[ Notifications ] 桌面消息

发表于 2019-01-08

在执行完以上代码后,我们就成功地创建了一个消息框实例,在Chrome下面它最终会显示成这样:

到这里我们已经成功了一半,但能不能正确地显示出这个消息框,最终还取决于用户的授权。鉴于浏览器的安全机制,只有用户同意网页弹出消息通知框,消息通知才能够真正的显示出来。所以现在我们要做的就是申请用户授权。

Notification类提供了一个requestPermission方法,用来请求用户授权,代码如下:

1
2
3
4
Notification.requestPermission(function (permission) {
  console.log(permission);
  popNotice();
});

温馨提示:用户一旦没有授权,拒绝,以上方法将不再执行!

示例demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>桌面消息</title>
</head>
<body>
<!--JS代码:-->
<script type="text/javascript">
// 判断是否支持Notification
if (window.Notification) {
//Notification 方法
var popNotice = function () {
var notification = new Notification("Hi,帅哥:", {
body: '可以加你为好友吗?', //显示消息的内容
icon: 'http://image.zhangxinxu.com/image/study/s/s128/mm1.jpg' //显示消息的缩略图
});

//消息框被点击时被调用
//可以打开相关的视图,同时关闭该消息框等操作
notification.onclick = function () {
notification.close();
};

//5秒后关闭消息框
notification.onshow = function () {
setTimeout(function () {
notification.close();
}, 5000);
};
};

if (Notification.permission == "granted") { //授权
popNotice();
} else if (Notification.permission != "denied") { //没有授权时询问
Notification.requestPermission(function (permission) {
console.log(permission);
popNotice();
});
}
} else {
alert('浏览器不支持Notification');
}
</script>

</body>
</html>

centos下mysql自动备份(亲测可用)

发表于 2019-01-04

编写sh脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#!/bin/bash
db_user="root"
db_passwd="123456"
db_name="test_db"
#进入备份目录将之前的移动到old目录
cd /mnt/backup/bakmysql
echo "you are in bakmysql directory now"
mv test_db* /mnt/backup/bakmysqlold
echo "Old databases are moved to bakmysqlold folder"
#备份目录
backup_dir="/mnt/backup/bakmysql"
#时间格式
time=$(date +"%Y-%m-%d")
#mysql 备份的命令,注意有空格和没有空格
mysqldump -u$db_user -p$db_passwd $db_name > "$backup_dir/$db_name"-"$time.sql"
echo "your database backup successfully completed"
#这里将7天之前的备份文件删掉
SevenDays=$(date -d -7day +"%Y-%m-%d")
if [ -f /mnt/backup/bakmysqlold/pashanhu-$SevenDays.sql ]
then
rm -rf /mnt/backup/bakmysqlold/pashanhu-$SevenDays.sql
echo "you have delete 7days ago bak sql file "
else
echo "7days ago bak sql file not exist "
echo "bash complete"
fi

然后通过下面命令将脚步加入系统的计划任务

1
2
3
crontab -e

0 2 * * * cd /usr/sbin/ && ./bakmysql.sh

保存退出以后就可以了。

也许需要重启crontab 启用命令:/sbin/service crond restart

后期更改~结果如下

Windows IIS注册asp 此操作系统版本不支持此选项 错误解决方法

发表于 2018-12-07



更新Win10,原来的IIS站点访问不了,原因是因为IIS 没有.net 4.5,使用网上的aspnet_regiis.exe -i命令,一点都不靠谱,直接提示:

C:\WINDOWS\system32>c:\windows\microsoft.net\framework64\v4.0.30319\aspnet_regiis.exe -i

Microsoft (R) ASP.NET RegIIS 版本 4.0.30319.0

用于在本地计算机上安装和卸载 ASP.NET 的管理实用工具。

版权所有(C) Microsoft Corporation。保留所有权利。

开始安装 ASP.NET (4.0.30319.0)。

此操作系统版本不支持此选项。管理员应使用“打开或关闭 Windows 功能”对话框、“服务器管理器”管理工具或 dism.exe 命令行工 具安装/卸载包含 IIS8 的 ASP.NET4.5。

有关更多详细信息,请参见 http://go.microsoft.com/fwlink/?LinkID=216771。 ASP.NET (4.0.30319.0)安装完毕。

后来辗转找到了一篇文章,原文如下:http://www.jb51.net/os/windows/509075.html,利用dism工具 执行下面命令才成功

dism /online /enable-feature /featurename:IIS-ISAPIFilter

dism /online /enable-feature /featurename:IIS-ISAPIExtensions

dism /online /enable-feature /featurename:IIS-NetFxExtensibility45

dism /online /enable-feature /featurename:IIS-ASPNET45

作者:天国的声音
链接:https://www.jianshu.com/p/7b453b7495d3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Centos7 初始化硬盘分区、挂载

发表于 2018-11-19
  1. 通过命令fdisk-l查看硬盘信息

可以看到有两块硬盘/dev/vda和/dev/vdb,启动vda是系统盘vdb是我们新增的数据盘。

2.执行以下命令,进入fdisk模式,开始对新增数据盘执行分区操作。

fdisk 新增数据盘

以新挂载的数据盘“/dev/xvdb”为例:

fdisk /dev/xvdb

回显类似如下信息:

3.输入“n”,按“Enter”,开始新建分区。
回显类似如下信息:

表示磁盘有两种分区类型:

  • “p”表示主要分区。
  • “e”表示延伸分区。

4.以创建一个主要分区为例,输入“p”,按“Enter”,开始创建一个主分区。
回显类似如下信息:

“Partition number”表示主分区编号,可以选择1-4。

5.以分区编号选择“1”为例,输入主分区编号“1”,按“Enter”。
回显类似如下信息

“First sector”表示初始磁柱区域,可以选择2048-20971519,默认为2048。

6.以选择默认初始磁柱编号2048为例,按“Enter”。
回显类似如下信息:

“Last sector”表示截止磁柱区域,可以选择2048-104857599,默认为104857599。

7.以选择默认截止磁柱编号2104857599为例,按“Enter”。
回显类似如下信息:

表示分区完成,即为50GB的数据盘新建了1个分区。

8.输入“p”,按“Enter”,查看新建分区的详细信息。
回显类似如下信息:

表示新建分区“/dev/vdb1”的详细信息。

9.输入“w”,按“Enter”,将分区结果写入分区表中。
回显类似如下信息:

表示分区创建完成。

10.执行以下命令,将新的分区表变更同步至操作系统。

partprobe

11.执行以下命令,将新建分区文件系统设为系统所需格式。
mkfs -t 文件系统格式 /dev/vdb1

以设置文件系统为“ext4”为例:

mkfs -t ext4 /dev/vdb1

回显类似如下信息:

格式化需要等待一段时间,请观察系统运行状态,不要退出。

12.执行以下命令,新建挂载点。

mkdir 挂载点

以新建挂载点“/XC”为例:

mkdir /XC

13.执行以下命令,将新建分区挂载到12中新建的挂载点下。

mount /dev/vdb1 挂载点

以挂载新建分区至“/XC”为例:

mount /dev/vdb1 /XC

14.执行以下命令,查看挂载结果。

df -TH

回显类似如下信息:

表示新建分区“/dev/vdb1”已挂载至“/XC”。

设置开机自动挂载磁盘

如果您需要在云服务器系统启动时自动挂载磁盘,不能采用在 /etc/fstab直接指定 /dev/xvdb1的方法,因为云中设备的顺序编码在关闭或者开启云服务器过程中可能发生改变,例如/dev/xvdb1可能会变成/dev/xvdb2。推荐使用UUID来配置自动挂载数据盘。

说明:磁盘的UUID(universally unique identifier)是Linux系统为存储设备提供的唯一的标识字符串。

1.执行如下命令,查询磁盘分区的UUID。
blkid 磁盘分区

以查询磁盘分区“/dev/vdb1”的UUID为例:

blkid /dev/vdb1

回显类似如下信息:

表示“/dev/vdb1”的UUID。

2.通过vim编辑`/etc/fstab

在末尾增加一行

UUID=f5c5c392-4704-4475-9abc-f6a2e049f2ea /XC ext4 defaults 0 2

保存

3.重启服务器

通过命令df -TH查看磁盘信息

可以看出已经自动挂载了。

开机自动挂载磁盘错误,将会造成无法开机,解决方法,通过单用户模式进入系统,修改挂载配置

vnc单用户模式进入 https://www.west.cn/faq/list.asp?unid=756
更改开机自动挂载磁盘配置 https://wenku.baidu.com/view/58c7e1f0f61fb7360b4c6503.html

使用sshfs挂载远程服务器目录

发表于 2018-11-15



点击访问原文
您还可以加入全栈技术交流群(QQ群号:254842154)

*

服务器日志查看,是开发人员和服务器运维人员在工作中经常会遇到的一件事情,只有一台服务器时,比较好办,直接登录服务器使用tail -f file-path 命令就可以实时查看到日志文件的输出。当有负载的需要,服务器多了之后,就会比较麻烦,为了查找一个问题的日志可能需要登录多台服务器。今天给大家介绍一种借助sshfs,非常简单的日志文件挂载方案,可以方便大家查看服务器日志文件。

> sshfs介绍

sshfs是基于fuse构建的ssh文件系统客户端程序,通过它远程主机的配置无需作任何改变,就可以透过SSH协议来挂载远程文件系统了,非常方便及安全。

sshfs的安装,在centOS中的安装命令如下:

yum -y install sshfs

1
2
3
4
5
6
7
8
9
10
11

> 挂载

sshfs的远程文件挂载,需要结合ssh免密码登录一起实施。假设现在有A、B、C三台服务器的日志,需要挂载到D服务器。首先需要将D服务器的公钥写入A、B、C三台服务器。配置方法参见我之前的[文章](https://link.jianshu.com?t=http://www.hello1010.com/linux_scp)。

把远程服务器的 `/mydata/logs/`目录下的所有文件,挂载到D服务器,在D服务器的`/mydata/logs/`目录下为每个服务器建一个目录。(ip_address_A代表A服务器的ip地址,需要自行替换)

<pre class="hljs ruby"><code class="ruby">/<span class="hljs-regexp">/把A服务器的 /mydata<span class="hljs-regexp">/logs/ 目录 挂载到 D服务器的 /mydata/logs/A/ 目录

sshfs root@ip_address_A<span class="hljs-symbol">:/mydata/logs/ /mydata/logs/A/
</span></span></span></code>


其他两台服务器的挂载方法一样。挂载成功后,可以使用 mount命令查看挂载情况:


mount -l

1
2
3
4
5
6
7
8
9

可以看到挂载的情况:

<pre class="hljs ruby"><code class="ruby">root@ip_address_A<span class="hljs-symbol">:/mydata/logs/on /mydata/logs/A type fuse.sshfs (rw,nosuid,nodev)

root@ip_address_B<span class="hljs-symbol">:/mydata/logs/on /mydata/logs/B type fuse.sshfs (rw,nosuid,nodev)

root@ip_address_C<span class="hljs-symbol">:/mydata/logs/on /mydata/logs/C type fuse.sshfs (rw,nosuid,nodev)
</span></span></span></code>


也可以使用df -h命令查看磁盘的挂载情况。另外,想要开机自动挂载目录,可以编辑/etc/fstab文件,加入以下几行:

sshfs#root@ip_address_A:/mydata/logs/ /mydata/logs/A fuse defaults,auto,allow_other 0 0

sshfs#root@ip_address_B:/mydata/logs/ /mydata/logs/B fuse defaults,auto,allow_other 0 0

sshfs#root@ip_address_C:/mydata/logs/ /mydata/logs/C fuse defaults,auto,allow_other 0 0
1
2
3
4
5
6
7

其中,`allow_other`参数代表该设置对其他用户也生效。也必须先把ssh自动登录配置好了,让root用户能够使用root身份登录远程主机。配置方法参见我之前的[文章](https://link.jianshu.com?t=http://www.hello1010.com/linux_scp)。

挂载成功后,就可以在服务器D直接查看所有服务器的日志了,在D服务器的`/mydata/logs/`目录输入以下命令。(假设A、B、C三台服务器的`/mydata/logs/`目录下都有log.txt这个文件)

<pre class="hljs cpp"><code class="cpp">tail -f */<span class="hljs-built_in">log.txt
</span></code>


日志的输出中,会标出日志是在哪台服务器的,例如:

==> A/log.txt <==
get log message from A
1
2
3
4
5

假如只想查看日志中包含关键字 `a b c`的日志,可以这样查看

<pre class="hljs bash"><code class="bash"> tail -f */log.txt | grep <span class="hljs-string">'a b c'
</span></code>


日志的输出会有一定的延时。
需要注意的是,取消挂载时,不要直接删除挂载目录,请使用以下命令取消挂载:


fusermount -u /mydata/logs/A

`

或者直接使用umount命令取消挂载。

作者:hellojammyPlus
链接:https://www.jianshu.com/p/cdf5652a88d3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

yum install --downloadonly 下载依赖包到本地 但不安装

发表于 2018-11-15

如果手动去一个个找依赖是很困难的,即便已经知道名字、版本,下面就依赖系统自带的命令完成该步骤

以java为例,其他安装包只要替换包名

1
yum install --downloadonly --downloaddir=/home/java java

CentOS 7安装SSHFS 实现远程主机目录 挂载为本地目录

发表于 2018-11-15

安装sshfs

官方下载地址 https://github.com/libfuse/sshfs/releases

首先,我们需要安装sshfs软件。sshfs是一个基于SSH文件传输协议的文件系统客户端,它的官方网页是:http://fuse.sourceforge.net/sshfs.html 。在CentOS下,我们可以通过yum来安装(注意使用yum安装需要安装EPEL源):

yum -y install fuse-sshfs

安装好后,系统会自动建立fuse用户组,要使用sshfs的用户只要加入这个用户组即可。

挂载远程目录
要想挂载远程目录,使用如下命令即可:
sshfs user@hostname:path mout_point
例如:sshfs root@127.0. 0. 0:/data/www/rabbit/Upload/ /mnt/file_server_storage
/mnt/file_server_storage为本地的路径
这里user为远程主机用户名,hostname为远程主机IP地址,path为远程主机中想要挂载到本地的目录,mount_point为挂载到本地的目录。

卸载挂载点
当不需要使用的时候,使用以下命令卸载:
fusermount -u mount_point
如果想要开机自动挂载,可以在/etc/fstab中加入下面一行:
sshfs#user@hostname:path mount_point fuse defaults,auto,allow_other 0 0
这就要求必须先把ssh自动登录配置好了,让root用户能够使用user身份登录远程主机,另外allow_other这个参数很重要,没有这个参数的话,挂载过来的目录只有root能够访问。

以下为实际操作中所遇到的问题
1、执行卸载命令:
fusermount -u /mnt/file_server_storage

提示device is busy.
执行: umount -fl ./file_server_storage 命令可以完成卸载.
关于: umount 命令
umount可卸除目前挂在Linux目录中的文件系统

2、关于操作操作权限
以前经常出现执行挂载命令以后,shell命令可以直接进入挂载点操作,但远程程序一直无法操作成功。
后来发现是需要加上-o 参数:
执行sshfs –h 会看到如下帮助说明

FUSE options:
FUSE(用户空间文件系统)
用户空间文件系统(Filesystem in Userspace),是Linux 中用于挂载某些网络空间,如SSH,到本地文件系统的模块,在SourceForge上可以找到相关内容。

sshfs root@127.0. 0. 0:/data/www/rabbit/Upload/ /mnt/file_server_storage
//替换为以下命令即可
sshfs root@127.0. 0. 0:/data/www/rabbit/Upload/ /mnt/file_server_storage –o allow_other

配合的在/etc下面增加了一个文件fuse.conf
在fuse.conf里面就一句话: user_allow_other,保存退出即可。

123…42
庞国明

庞国明

Software make the information world run, and programer make the softeware run.

420 日志
3 分类
267 标签
GitHub E-Mail Twitter StackOverflow Instagram
© 2021 庞国明
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4