Zhuanli&Blog


  • 首页

  • 标签

  • 分类

  • 归档

tmux简单使用

发表于 2018-12-22 | 分类于 tools

Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机。是BSD实现的Screen替代品,相对于Screen,它更加先进:支持屏幕切分,而且具备丰富的命令行参数,使其可以灵活、动态的进行各种布局和操作。

Tmux 可用于在一个终端窗口中运行多个终端会话。不仅如此,还可以通过 Tmux 使终端会话运行于后台或是按需接入、断开会话,这个功能非常实用。

Tmux的使用场景
1)可以某个程序在执行时一直是输出状态,需要结合nohup、&来放在后台执行,并且ctrl+c结束。这时可以打开一个Tmux窗口,在该窗口里执行这个程序,用来保证该程序一直在执行中,只要Tmux这个窗口不关闭
2)公司需要备份数据库时,数据量巨大,备份两三天弄不完,这时不小心关闭了终端窗口或误操作就前功尽弃了,使用Tmux会话运行命令或任务,就不用担心这些问题。
3)下班后,你需要断开ssh或关闭电脑,将运行的命令或任务放置后台运行。
4)关闭终端,再次打开时原终端里面的任务进程依然不会中断

1)Tmux功能:

  • 提供了强劲的、易于使用的命令行界面。
  • 可横向和纵向分割窗口。
  • 窗格可以自由移动和调整大小,或直接利用四个预设布局之一。
  • 支持 UTF-8 编码及 256 色终端。
  • 可在多个缓冲区进行复制和粘贴。
  • 可通过交互式菜单来选择窗口、会话及客户端。
  • 支持跨窗口搜索。
  • 支持自动及手动锁定窗口。

2)Tmux安装
a)ubuntu版本下直接apt-get安装

1
sudo apt-get install tmux

b)centos7版本下直接yum安装

1
yum install -y tmux

3) Tmux常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1)进入tmux面板后,一定要先按ctrl+b,然后松开,再按其他的组合键才生效。

2)常用到的几个组合键:
ctrl+b ? 显示快捷键帮助
ctrl+b 空格键 采用下一个内置布局,这个很有意思,在多屏时,用这个就会将多有屏幕竖着展示
ctrl+b ! 把当前窗口变为新窗口
ctrl+b " 模向分隔窗口
ctrl+b % 纵向分隔窗口
ctrl+b q 显示分隔窗口的编号
ctrl+b o 跳到下一个分隔窗口。多屏之间的切换
ctrl+b 上下键 上一个及下一个分隔窗口
ctrl+b C-方向键 调整分隔窗口大小
ctrl+b & 确认后退出当前tmux
ctrl+b [ 复制模式,即将当前屏幕移到上一个的位置上,其他所有窗口都向前移动一个。
ctrl+b c 创建新窗口
ctrl+b n 选择下一个窗口
ctrl+b l 最后使用的窗口
ctrl+b p 选择前一个窗口
ctrl+b w 以菜单方式显示及选择窗口
ctrl+b s 以菜单方式显示和选择会话。这个常用到,可以选择进入哪个tmux
ctrl+b t 显示时钟。然后按enter键后就会恢复到shell终端状态
ctrl+b d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话

leetcode 130. Surrounded Regions

发表于 2018-12-21 | 分类于 leetcode

题目链接:leetcode

思路:
广度优先

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
import collections
class Solution:
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
queue = collections.deque()
for r in range(len(board)):
for c in range(len(board[0])):
if (r in [0, len(board)-1] or c in [0, len(board[0])-1]) and board[r][c] == "O":
queue.append((r, c))
while queue:
#print(queue)
r, c = queue.popleft()
if 0<=r<len(board) and 0<=c<len(board[0]) and board[r][c] == "O":
board[r][c] = "D"
queue.append((r-1, c)); queue.append((r+1, c))
queue.append((r, c-1)); queue.append((r, c+1))
#print(board)
for r in range(len(board)):
for c in range(len(board[0])):
if board[r][c] == "O":
board[r][c] = "X"
elif board[r][c] == "D":
board[r][c] = "O"

leetcode 129. 求根到叶子节点数字之和

发表于 2018-12-20 | 分类于 leetcode

题目链接:leetcode

思路:
广度优先

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
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import deque
class Solution:
def sumNumbers(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:return 0
res = 0
q = deque()
q.append((root,root.val))
while q:
node,val = q.popleft()
#leaf node
if not node.left and not node.right:
res += val
if node.left:
q.append((node.left,node.left.val+val*10))
if node.right:
q.append((node.right,node.right.val+val*10))
return res

leetcode 127. Word Ladder

发表于 2018-12-19 | 分类于 leetcode

题目链接:leetcode

思路:
回溯法

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
from collections import deque
class Solution:

def getNeighbors(self,word):
neighbors = []
letters = 'abcdefghijklmnopqrstuvwxyz'
for i in range(len(word)):
for letter in letters:
newWord = word[:i]+letter+word[i+1:]
if newWord not in self.visitedSet and newWord in self.wordSet:
if newWord == self.endWord:
return [newWord]
self.visitedSet.add(newWord)
neighbors.append(newWord)
return neighbors

def ladderLength(self, beginWord, endWord, wordList):
"""
:type beginWord: str
:type endWord: str
:type wordList: List[str]
:rtype: int
"""
if endWord not in wordList:return 0
level = 1
self.endWord = endWord
self.visitedSet = set()
self.wordSet = set(wordList)
q = deque()
q.append(beginWord)
q.append('Level')
while len(q) != 0:
word = q.popleft()
if word == 'Level':
level += 1
if len(q) > 0:
q.append('Level')
continue
neighbors = self.getNeighbors(word)
if neighbors:
print("level={},word={},neighbors={}".format(level,word,neighbors))
for neighbor in neighbors:
if neighbor == self.endWord:
return level+1
q.append(neighbor)
return 0

leetcode 109. Convert Sorted List to Binary Search Tree

发表于 2018-12-07 | 分类于 leetcode

题目链接:leetcode

思路:
把链表转成数组,再用递归生成树。

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
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution:
def get_midnode(self,arr):
if not arr:return None
mid = len(arr)//2
node = TreeNode(arr[mid])
node.left = self.get_midnode(arr[:mid])
node.right = self.get_midnode(arr[mid+1:])
return node
def sortedListToBST(self, head):
"""
:type head: ListNode
:rtype: TreeNode
"""
node,arr=head, []
while node:
arr.append(node.val)
node = node.next
return self.get_midnode(arr)

gcc和程序生成的过程

发表于 2018-11-20 | 分类于 c

1简介

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。

2简单编译

示例程序如下:

1
2
3
4
5
6
7
//test.c
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}

这个程序,一步到位的编译指令是:

gcc test.c -o test

实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。

2.1预处理

gcc -E test.c -o test.i 或 gcc -E test.c

可以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明白了。后面那条指令,是直接在命令行窗口中输出预处理后的代码.

gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。

2.2编译为汇编代码(Compilation)

预处理之后,可直接对生成的test.i文件编译,生成汇编代码:

gcc -S test.i -o test.s
gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

2.3汇编(Assembly)

对于上一小节中生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:

gcc -c test.s -o test.o

2.4连接(Linking)

gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成程序test

gcc test.o -o test

在命令行窗口中,执行./test。

3多个程序文件的编译

通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设有一个由test1.c和 test2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序test,可以使用下面这条命令:

gcc test1.c test2.c -o test

如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test

4检错

gcc -pedantic test.c -o test
-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。

除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息。

gcc -Wall illcode.c -o illcode
GCC给出的警告信息虽然从严格意义上说不能算作错误,但却很可能成为错误的栖身之所。一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持标准、健壮的特性。所以将警告信息当成编码错误来对待,是一种值得赞扬的行为!所以,在编译程序时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改,如下:

gcc -Werror test.c -o test

5库文件连接

开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助许多函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(so、或lib、dll)的集合。

虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下;Windows所使用的库文件主要放在Visual Stido的目录下的include和lib,以及系统文件夹下。但也有的时候,我们要用的库不在这些目录下,所以GCC在编译时必须用自己的办法来查找所需要的头文件和库文件。

例如我们的程序test.c是在linux上使用c连接mysql,这个时候我们需要去mysql官网下载MySQL Connectors的C库,下载下来解压之后,有一个include文件夹,里面包含mysql connectors的头文件,还有一个lib文件夹,里面包含二进制so文件libmysqlclient.so

其中inclulde文件夹的路径是/usr/dev/mysql/include,lib文件夹是/usr/dev/mysql/lib

5.1编译成可执行文件

首先我们要进行编译test.c为目标文件,这个时候需要执行

gcc –c –I /usr/dev/mysql/include test.c –o test.o

5.2链接

最后我们把所有目标文件链接成可执行文件:

gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

5.3强制链接时使用静态链接库

默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。

在/usr/dev/mysql/lib目录下有链接时所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令:

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

静态库链接时搜索路径顺序:

  1. ld会去找GCC命令中的参数-L
  2. 再找gcc的环境变量LIBRARY_PATH
  3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:

  1. 编译目标代码时指定的动态库搜索路径
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
  4. 默认的动态库搜索路径/lib
  5. 默认的动态库搜索路径/usr/lib

有关环境变量:

  1. LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
  2. LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

linux使用corntab定时查询特定用户登录与工作

发表于 2018-11-15 | 分类于 linux

闲着无聊,想看看其他用户在我的服务器上什么时候登录,在干些什么,写了个脚本设置每小时查一次。

login.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
str=`w|grep userxx`
i=0
if [ ! ${#str} -eq 0 ]
then
for line in `echo $str`
do
let "i++"
if [ $(($i % 8)) -eq 0 ]
then
#查询干了些什么,在什么时候
echo "`date`,$line">> login.log
fi
done
fi

设置定时
crontab -e

1
* */1 * * * /home/xxx/login.sh > /dev/null 2>&1 &

python格式化字符串

发表于 2018-11-14 | 分类于 python

%-formatting

使用

1
2
name = "Eric"
"Hello, %s." % name

插入多个变量需要元组

“Hello, %s. You are %s.” % (name, age)

这种格式不是很好,因为它是冗长的,会导致错误,比如不能正确显示元组或字典

str.format()

这种更新的工作方式是在Python 2.6中引入的

使用

1
"Hello, {}. You are {}.".format(name, age)

可以使用字典

1
2
person = {'name': 'Eric', 'age': 74}
"Hello, {name}. You are {age}.".format(**person)

使用str.format()的代码比使用%-formatting的代码更易读,但当处理多个参数和更长的字符串时,str.format()仍然可能非常冗长

f-Strings

f-Strings也称为“格式化字符串文字”,F字符串是开头有一个f的字符串文字,以及包含表达式的大括号将被其值替换。表达式在运行时进行渲染,然后使用__format__协议进行格式化。在python3.6中引入.

使用

1
2
3
name = "Tom"
age = 74
f"Hello, {name}. You are {age}."

sonarqube 搭建过程

发表于 2018-11-14 | 分类于 tools

SonarQube简介

Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
此外,Sonar 的插件还可以对 Java 以外的其他编程语言(支持的语言包括:Java、PHP、C#、C、Cobol、PL/SQL、Flex等)提供支持,对国际化以及报告文档化也有良好的支持。可以说Sonar是目前最强大的代码质量管理工具之一。
下面就来揭开Sonar的神秘面纱,看看如何在Centos环境上安装Sonar。

安装环境:

系统环境:centos6.9 -i686(最小化安装)
前置条件:jdk1.8 , mysql-5.7
软件下载目录:/usr/local/
软件安装目录:/usr/local/
软件版本:sonarqube-6.7.5,sonar-scanner-cli-3.2.0.1227-linux

先决条件:

vm.max_map_count 大于或等于262144
fs.file-max 大于或等于65536
运行SonarQube的用户可以打开至少65536个文件描述符
运行SonarQube的用户可以打开至少2048个线程

可以在/etc/sysctl.conf和/etc/security/limits.conf文件中设置

配置环境变量
java安装1.8版本,在/etc/profile添加路径。

Mysql安装5.7版本,设置mysql的环境通过文档资料https://blog.csdn.net/Luck_ZZ/article/details/80341693

Sonarqube在/etc/profile添加路径

Sonar-scanner在/etc/profile添加路径

配置sonar.properties和sonar-scanner

配置sonar-scanner的项目配置sonar-project.properties
模板:
sonar.projectKey=my:project
sonar.projectName=yaok
sonar.projectVersion=1.0

#Paths to source directories.

#Paths are relative to the sonar-project.properties file. Replace “\” by “/“ on Windows.

#Do not put the “sonar-project.properties” file in the same directory with the source code.

#(i.e. never set the “sonar.sources” property to “.”)
sonar.sources=/root/java

#The value of the property must be the key of the language.
sonar.language=java

#Encoding of the source code
sonar.sourceEncoding=UTF-8

启动sonar

Root用户无法启动,需要新建用户
[root@localhost ]# useradd sonaruser
[root@localhost local]# chown sonaruser:sonaruser sonarqube
[root@localhost sonarqube]# su sonaruser
[sonaruser@localhost sonarqube]$ ./sonar.sh start

下载插件
因为官方插件sonarCFamily需要money,所以使用了其他的插件,下载地址https://github.com/SonarOpenCommunity/sonar-cxx,下载放在/usr/local/sonarqube/extensions/plugins/里面,然后重启sonarqube。

安装测试代码环境

1.安装cppcheck

Cppcheck是Cppcheck是一个C/C++代码的静态分析工具。与C++编译器和其他许多分析工具不同,Cppcheck不检测代码中的语法错误,只检测那些编译器通常无法检测到的bug类型,目的是只检测代码中真正的错误。

特点:
检查边界溢出
检查内存泄漏
检查可能的空指针间接引用
检查未初始化的变量
检查无效的STL使用
检查异常安全
警告如果过时的或者不安全的函数使用
警告未使用的或者冗余的代码
检测各种潜在bugs的可疑代码
下载地址http://cppcheck.sourceforge.net/

2.安装rats

RATS 是一个代码安全审计工具,可扫描 C、C++、Perl、PHP 和 Python 源码,检查出一些常见的安全问题,例如缓冲区溢出和 TOCTOU (Time Of Check, Time Of Use) 。
下载地址https://github.com/andrew-d/rough-auditing-tool-for-security

3.安装valgrind

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。
内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。
Valgrind包括如下一些工具:
Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。
Callgrind:它主要用来检查程序中函数调用过程中出现的问题。
Cachegrind:它主要用来检查程序中缓存使用出现的问题。
Helgrind:它主要用来检查多线程程序中出现的竞争问题。
Massif:它主要用来检查程序中堆栈使用中出现的问题。
Extension:可以利用core提供的功能,自己编写特定的内存调试工具。
下载地址:http://valgrind.org/

4.安装gcovr

gcovr是一个将单元测试中的代码覆盖率以多种方式(包括列表方式、XML文件方式、HTML网页方式等)展示出来的工具。
下载地址:https://pypi.python.org/pypi/gcovr

5.写一个集成这些工具的脚本

Makefile脚本如下:
上半部为编译项目,通过@$(MAKE) -C src执行src目录下的makefile编译项目
下半部为通过cppcheck,rats,valgrind,gcovr工具生成测试扫描代码的报告
alt

6.配置报告路径,执行脚本

配置文件sonar-project.properties

具体如下
sonar.projectKey=ncsrv
sonar.projectName=ncsrv
sonar.projectVersion=1.0

#Paths to source directories.

#Paths are relative to the sonar-project.properties file. Replace “\” by “/“ on Windows.

#Do not put the “sonar-project.properties” file in the same directory with the source code.

#(i.e. never set the “sonar.sources” property to “.”)
sonar.sources=./src

#The value of the property must be the key of the language.
sonar.language=c++

#Encoding of the source code
sonar.sourceEncoding=UTF-8
sonar.cpp.missingIncludeWarnings=true
sonar.cxx.includeDirectories=/usr/include/c++/4.4.4,/usr/include,/home/pas36/include,/usr/local/mysql/include,/usr/include/libxml2/,/usr/include/c++/4.4.4/tr1,/usr/include/linux,src

#paths to the reports
sonar.cxx.cppcheck.reportPath=build/cppcheck-report.xml
sonar.cxx.pclint.reportPath=build/pclint-report.xml
sonar.cxx.coverage.reportPath=build/gcovr-report.xml
sonar.cxx.coverage.itReportPath=build/gcovr-report
.xml
sonar.cxx.coverage.overallReportPath=build/gcovr-report*.xml
sonar.cxx.valgrind.reportPath=build/valgrind-report.xml
sonar.cxx.rats.reportPath=build/rats-report.xml
sonar.cxx.xunit.reportPath=build/xunit-report.xml

然后执行脚本make & make sonar,如果之前执行过,使用make clean清除一下。

看测试结果并根据报告改进代码

在http://192.168.20.199:9000,用户密码都是admin

sonarqube搭建时遇到的坑

发表于 2018-11-05 | 分类于 tools

SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,网上有许多教程,我也是通过网上的教程搭起来的,就不细说了,主要说下搭建的时候遇到的问题。

我在windows先搭起来,很简单,然后在centos搭建,遇到一些问题

1.版本要对,java版本要1.8,mysql要5.6以上,我的centos之前有1.7的版本,mysql是5.1版本,所以搭起来执行sonar.sh start没反应
。

重点注意,遇到搭错的问题要勤看日志,不然就像无头苍蝇不知道错在哪,
日志在logs目录下,err.log,sonar.log,还有环境没什么问题的时候web服务起来,会出现web.log日志

查询版本问题 通过

1
2
yum -y list java*
yum -y list mysql*

安装的时候有时候yum源没有高版本的mysql需要更新源

2.安装之前环境要设置好,不然环境跑不起来,环境指这四个指标

  • vm.max_map_count is greater or equals to 262144
  • fs.file-max is greater or equals to 65536
  • the user running SonarQube can open at least 65536 file descriptors
  • the user running SonarQube can open at least 2048 threads

可以通过以下命令查询

1
2
3
4
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u

3.web环境是sonarqube自带的,不需要自己搭建nginx或apache服务器,只需要在配置文件中设置好;数据库要先建个database,

1
create database sonar

这个数据库名可以自定,只要和配置文件中的数据库名相同就行了,我定的‘sonar’,所以配置文件是这样的

1
sonar.jdbc.url=jdbc:mysql://192.168.20.199:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

配置文件中设置java虚拟机大小最好2g,配置文件中默认的太小了,才128m-512m
,跑web环境的时候根本跑不起来,需要看web.log日志的时候才能看出来。

123…20

zhuanli

194 日志
9 分类
41 标签
GitHub
© 2018 — 2019 zhuanli
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4