0%

脚本如下

1
2
3
4
5
6
7
8
9
SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, 
ind.name AS IndexName, indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind
ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
WHERE indexstats.avg_fragmentation_in_percent > 30
ORDER BY indexstats.avg_fragmentation_in_percent DESC

安装docker版jenkins

因为jenkinsdocker版本本身没有 dotnetcore的环境,所以我们需要先自己动手制作下包含dotnet环境的jenkins Docker Container

Dockerfile

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
FROM jenkins/jenkins

# Switch to root to install .NET Core SDK
USER root

# Show distro information!
RUN uname -a && cat /etc/*release

# Based on instructiions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current
# Install dependency for .NET Core 2
RUN apt-get update
RUN apt-get install -y curl libunwind8 gettext apt-transport-https

# Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current
# Install microsoft.qpg
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
RUN mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list'

# Install the .NET Core framework
RUN apt-get update
RUN apt-get install -y dotnet-sdk-2.1.4

# Switch back to the jenkins user.
USER jenkins

为了方便我已经把配置信息放到了github上大家可以访问直接使用

https://github.com/YahuiWong/jenkins-dotnet-core

使用步骤

初始化docker环境

1
2
3
4
git clone https://github.com/YahuiWong/jenkins-dotnet-core.git
cd jenkins-dotnet-core
sh init.sh
docker-compose up -d

初始化配置jenkins

  1. Open ip:8080 on the browser

  2. vi jenkins_home/secrets/initialAdminPassword & Set the initialAdminPassword string to your jenkins page

至此安装完毕。

配置jenkins构建dotent core的任务

构建一个自由风格的软件项目

jenkins-docker-dotnet-core-publish-201853118046

配置源码管理资料

jenkins-docker-dotnet-core-publish-201853118236

注意:初次配置的话 需要在 添加一个可以访问代码地址的 Credentials

配置构建脚本

如下图步骤添加打包脚本
jenkins-docker-dotnet-core-publish-201853118512

打包脚本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
echo '============查看打包环境================' 
pwd
ls
echo $PATH
whoami
which dotnet
dotnet --info
dotnet --version
echo '============================begin restore======================================='
dotnet restore
echo '============================end restore======================================='
echo '============================cd project======================================='
cd ./您的项目路径
echo '============================begin build======================================='
dotnet build # 为了生成XML注释文件 用于swagger注释
rm -rf $WORKSPACE/jenkins_publish
mkdir $WORKSPACE/jenkins_publish
dotnet publish -c:Release -o $WORKSPACE/jenkins_publish # 如果针对给定运行时发布项目带上-r 如:-r centos.7-x64
cp ./bin/Debug/netcoreapp2.0/您的项目路径.xml $WORKSPACE/jenkins_publish/ # 拷贝swagger注释
echo '============================end build======================================='

配置发布途径

发布插件Publish Over FTP使用说明

我这里使用的是 jenkinsPublish Over FTP插件,安装好此插件之后在 系统管理->系统设置->Publish over FTP 里可以新增一个你要发布的ftp服务器信息。为了保证ftp可以正常连接建议尝试下右下角的Test Configuration确认success

上面我们已经配置好Publish Over FTP要用的ftp账号,新增我们新增构建后操作如下图选择此插件
jenkins-docker-dotnet-core-publish-2018531182746

然后选择配置好的ftp选项,配置如下所示
jenkins-docker-dotnet-core-publish-2018531183019

注意:这里的配置信息中 jenkins_publish是和打包脚本对应的

保存打包任务

立即构建

点击立即构建之后,把构建任务开始进行中
jenkins-docker-dotnet-core-publish-2018531184031

如果想看的实时的构建信息可以点击如下图看到控制台输出
jenkins-docker-dotnet-core-publish-2018531184219

构建完毕

打开部署站点地址,发现站点已经运行起来了

jenkins-docker-dotnet-core-publish-2018531184328

重点说明

Nuget配置说明

如果您的.NET CORE项目使用的了第三方或者自建nuget服务,您需要在 配置下 jenkins_home/.nuget/NuGet/NuGet.Config的信息
如我的使用了国内博客园的nuget加速地址和自建的nuget服务配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
<add key="nuget.cnblogs.com" value="https://nuget.cnblogs.com/v3/index.json" />
<add key="dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json" value="https://dotnet.myget.org/F/aspnetcore-dev/ap
i/v3/index.json" />
<add key="192.168.1.32:9001/nuget" value="http://192.168.1.32:9001/nuget" />
</packageSources>
<packageRestore>
<add key="enabled" value="True" />
<add key="automatic" value="True" />
</packageRestore>
<bindingRedirects>
<add key="skip" value="False" />
</bindingRedirects>
<packageManagement>
<add key="format" value="0" />
<add key="disabled" value="False" />
</packageManagement>
</configuration>

发布iis站点时,文件被占用

使用 app_offline.htm配置文件解决

可以先用ftp插件上传一个app_offline.htm文件,部署完站点之后删除此文件
具体参考:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.1#app_offlinehtm

执行远程命令 解除占用

上一种解决方案文件被占用的方案有个弊端,app_offline.htm生效时间无法保证,所以最直接方案是直接使用命令行 关闭和启动站点 来解除占用

安装 配置 SSH plugin

搜索到插件安装好插件之后 在 系统设置 -> 全局设置 里面设置 目标服务ssh的ip端口&账号信息
为了保证是可以使用的 请 Test Configuration 通过
需要注意的是:Remote Directory 选项是 该ssh账号的默认目录 在之后的发布任务 设置的目录又是以 Remote Directory 为 根目录为基础的!

构建任务设置顺序 调整

核心模块 调成为:编译打包->ssh远程关闭iis站点->发布到远程根目录->ssh远程开启iis站点

转载请注明出处 http://blog.yahui.wang/2018/05/31/jenkins-docker-dotnet-core-publish/

SqlServer的存储过程使用到了分布式事务的时候,需要开启MSDTC服务并且设置相应的安全设置设置

链接服务器开启 RPCRPC Out

检查双边的服务器是否开启了以下服务

sqlserver-linkserver-transaction-2018530165547

检查双边 打开’控制面板’->’管理工具’->’组件服务’,点开’组件服务’->’计算机’->’我的电脑’,然后展开“我的电脑”,找到

sqlserver-linkserver-transaction-2018530165757
右键属性 设置为如下
sqlserver-linkserver-transaction-201853016592

SET XACT_ABORT ON

另外 存储过程中 可以根据自己的需求来决定是否添加如下代码

SET XACT_ABORT ON

SET XACT_ABORT ON的作用分为两种:

总体作为一个事务,整体提交或整体回滚,格式为:

SET XACT_ABORT ON
BEGIN TRAN
    --要执行的语句
COMMIT TRAN
GO

每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚,格式为:

SET XACT_ABORT ON
BEGIN
    --要执行的语句
END
GO

最近项目里面用到了React但是发布到iis站点之后,路由地址 刷新访问直接404错误。查阅资料之后发现是iis缺少配置URL重写 的问题导致的。下面我们来图形化配置,简单的配置下IIS

打开IIS使用 Web平台安装程序

搜索url关键字,您会看到

React-Router-browserHistory-IIS-2018518104435
直接安装

关掉IIS 重新打开IIS在站点右边的控制面板可以看到一个URL重写的功能

新增配置如下

React-Router-browserHistory-IIS-2018518104817

也可以直接 使用我的配置

配置如下 关键节点是:rewrite

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReactRouter" patternSyntax="ECMAScript" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_METHOD}" pattern="^GET$" />
<add input="{HTTP_ACCEPT}" pattern="^text/html" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

附:其他http-server配置说明

Nginx

1
2
3
4
5
6
7
8
9
10
server {
server_name react.yahui.wang
listen 80;

root /wwwroot/ReactDemo/dist;
index index.html;
location / {
try_files $uri /index.html;
}
}

Tomcat

找到conf目录下的web.xml文件,然后加上一句话让他定位回来

1
2
3
4
<error-page>
<error-code>404</error-code>
<location>/index.html</location>
</error-page>

Apache

.htaccess文件配置如下

1
2
3
4
5
6
7
8
9
10
11
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . /index.html [L]

</IfModule>

转载请注明出处 http://blog.yahui.wang/2018/05/18/React-Router-browserHistory-IIS/

Gitlab

GitLab是一个Git的代码托管工具,有免费的社区版允许我们在本地搭建代码托管网站,也有付费的企业版网站,能够在线托管代码。传统方式是手动下载Gitlab的软件包,然后搭建相关运行环境。不过这种方式非常麻烦,而且如果要更换机器所有配置工作又得重来一边,如果有同学学过Java的话应该记得初学Java时配置环境变量的恐惧吧?因此更好的办法就是使用现在非常流行的Docker。

那么Docker又是个什么东西呢?这是一个虚拟化的运行工具,主要目的是将软件和整个运行环境打包起来,让我们不需要配置即可快速运行软件。由于Docker依赖于Linux内核的某些特性,所以Docker只能在Linux上运行。Windows上的Docker实际上是开了一个虚拟机。Docker目前好像没有比较好的中文社区,我谷歌了一下只找到了这个Docker中文社区,看起来还行。

下载Gitlab

配置好加速器之后,下载就很快了。直接执行下面的命令,稍等片刻之后,Docker就会将Gitlab下载好了。

1
sudo docker pull gitlab/gitlab-ce:latest

启动Gitlab

用下面的命令启动一个默认配置的Gitlab。如果我们只在本机测试使用的话,将hostname替换为localhost。如果需要让外部系统也能访问的话使用外网IP地址。

1
2
3
4
5
6
7
8
9
sudo docker run --detach \
--hostname gitlab.yahui.wang \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

首次启动可能比较慢,需要等待一分钟左右的时间。我们可以使用sudo docker ps命令查看当前所有Docker容器的状态。当它的状态由starting变为运行时间时,说明成功启动了。我们直接使用上面配置的IP地址(如localhost)在浏览器中访问即可。

初次使用需要我们创建默认管理员密码,随便指定一个就行了。然后我们需要注册一个普通用户。以后的使用方法和Github这样的工具很相似了。

配置Gitlab

刚刚启动Gitlab的时候需要我们输入一个密码,这个密码是管理员用户的密码。我们在登录那里使用root作为用户名,然后用刚刚设置的密码,就可以以管理员身份登录Gitlab。

登录进去之后,点击右上角的齿轮图标,即可进入到管理员页面。在这里我们可以设置很多东西。比如说,默认情况下每个用户只能创建10个仓库,我们可以改变这个设置。在管理员页面点击右面的齿轮,再点击设置,就会进入到系统设置中。然后找到Default projects limit一项,我们给它设个小目标,设它一个亿,这样就相当于无限仓库了。当然如果你实际硬盘满了也就不能在创建更多项目了。

如果这些配置还是不能满足你的需求的时候,还可以直接配置Gitlab。首先进入到Docker环境中。我们使用下面的命令进入Docker环境的bash中。gitlab是刚刚指定的Gitlab名称。

1
sudo docker exec -it gitlab /bin/bash

然后就进入了Docker的环境中,我们可以把它当作一个独立的系统来使用。然后编辑/etc/gitlab/gitlab.rb文件,这是Gitlab的全局配置文件。所有选项都可以在这里配置。

1
nano /etc/gitlab/gitlab.rb

详细的配置方法我也不会,直接看官方文档吧。

更新Gitlab

以后如果需要更新Gitlab版本,首先需要停止并删除当前的Gitlab实例。

1
2
sudo docker stop gitlab
sudo docker rm gitlab

然后在拉取最新版的Gitlab。

1
sudo docker pull gitlab/gitlab-ce:latest

然后在使用上次的配置运行Gitlab即可。不用担心数据会丢失。只要你的volume参数指定还和上次一样,Gitlab就会自动读取这些配置。

1
2
3
4
5
6
7
8
9
sudo docker run --detach \
--hostname gitlab.yahui.wang \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

最后来看看使用Docker的优势。还是在Gitlab的Bash中。我们依次输入下面的命令,看看有什么反应。

1
2
3
4
ruby --version
git --version
redis-cli --version
psql --version

不出意外的话应该会显示对应软件的版本。我们看到Gitlab使用了4个开源软件或运行环境:ruby、git、redis和postgresql。如果我们手动安装Gitlab的话,这几个软件也必须分别安装和配置好。这个任务的难度可是非常大的。而且如果需要在多台机器上配置,那么任务量就更大了。但是如果使用Docker的话,我们甚至完全没必要知道这几个软件的存在,简单两条命令即可创建和运行Gitlab。这正是Docker的魅力,难怪现在越来越多的公司在使用Docker。

补充

使用docker-compose部署的话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.yahui.wang'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.yahui.wang'
gitlab_rails['gitlab_shell_ssh_port'] = 2202
gitlab_rails['time_zone'] = 'Asia/Shanghai'
ports:
- '8008:80'
- '2202:22'
volumes:
- '/data/gitlab/config:/etc/gitlab'
- '/data/gitlab/logs:/var/log/gitlab'
- '/data/gitlab/data:/var/opt/gitlab'

参考资料
https://yq.aliyun.com/articles/29941
https://docs.gitlab.com/omnibus/docker/README.html#gitlab-docker-images
http://blog.csdn.net/u011054333/article/details/61532271

Git第一步,本地开发环境部署

基本环境安装

Mac环境

安装包管理工具 Homebrew

brew 全称HomebrewMac OSX上的软件包管理工具,官网https://brew.sh/
Homebrew 安装和卸载工具 只用一行命令就能完成

打开Mac OSX的命令终端
执行命令

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

命令执行完毕,既可以完成brew的安装

Mac安装GIT环境

命令终端输入:

1
brew install git

安装好之后建议安装下 smartgit便于管理本地git仓库

Window环境

安装包管理工具 chocolatey

Windows系统也有个很好用的包管理工具 chocolatey,这里我们使用chocolatey来很方面的安装我们需要的基本环境
说先安装 chocolatey
使用组合键(Win+X+A)打开Windows的命令终端 PowerShell or CMD

注意命令终端要在管理员模式下运行

  • 如果您使用的是CMD
1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
  • 如果您使用的是PowerShell
1
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

可能需要等待一会,具体等待时间由个人网络情况而定

Window安装GIT环境

安装好chocolatey之后我们可以安装各种开发环境和开发工具了

安装GIT

1
choco install git -y

安装完毕之后建议安装个tortoisegit 便于在资源管理器中管理本地git仓库

1
choco install tortoisegit -y

配合主流IDE使用

VisualStudio

AndroidStudio

Xcode

VSCode

Sublime

WebStorm

镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在):

通过config命令

1
2
npm config set registry https://registry.npm.taobao.org
npm info underscore (如果上面配置正确这个命令会有字符串response)

命令行指定

1
npm --registry https://registry.npm.taobao.org info underscore

编辑 ~/.npmrc

例如:C:\Program Files (x86)\nodejs\node_modules\npm\npmrc 文件 加入下面内容

1
registry = https://registry.npm.taobao.org

搜索镜像: https://npm.taobao.org

建立或使用镜像,参考: https://github.com/cnpm/cnpmjs.org

如果想换回来请吧上面的registry参数https://registry.npm.taobao.org改为https://registry.npmjs.org/即可

centos7.* 安装 python3,pip3

yum安装方式

添加epel源

1
yum install epel-release

安装Python3.4

1
python34

安装pip3

1
2
yum install python34-setuptools
easy_install-3.4 pip

之后就可以使用pip3

1
pip3

源代码编译安装此方法兼容保留Python2共存

安装依赖环境

1
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

查看最新的Python版本

浏览器打开 https://www.python.org/ftp/python/ 查看最新的Python版本,标记为3.A.B

1
wget https://www.python.org/ftp/python/3.A.B/Python-3.A.B.tgz

创建Python3的目录

1
mkdir /usr/local/python3

解压下载文件并切换目录

1
2
3
tar -zxvf Python-3.A.B.tgz

cd Python-3.A.B

执行

1
2
./configure --prefix=/usr/local/python3
make && make install

创建Python3的软链接

1
ln -s /usr/local/python3/bin/python3 /usr/bin/python3

创建Pip3的软链接

1
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

测试命令 python3 和 pip3

1
2
python3
pip3

总体安装 3.6.6的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
yum -y install gcc automake autoconf libtool make
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
mkdir /usr/local/python3
tar -zxvf Python-3.6.6.tgz
cd Python-3.6.6
./configure --prefix=/usr/local/python3
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
python3 -V
pip3 -V

稍作修改就变成了 2.7 的安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
wget https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
tar vxf Python-2.7.6.tgz
cd Python-2.7.6
./configure --prefix=/usr/local
make && make install
/usr/local/bin/python2.7 -V
mv /usr/bin/python /usr/bin/python2.6.6
ln -s /usr/local/bin/python2.7 /usr/bin/python
python -V
#sed -i "s/#!//usr//bin//python/#!//usr//bin//python2.6.6/g" /usr/bin/yum
wget https://bootstrap.pypa.io/ez_setup.py -O - | python
easy_install pip
rm -rf /usr/bin/{pip,pip2}
ln -s /usr/local/bin/pip /usr/bin/pip
ln -s /usr/local/bin/pip /usr/bin/pip2
#vim /usr/bin/yum
# 将文件头部的
# #!/usr/bin/python

# 改成
# #!/usr/bin/python2.6.6

我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处:

1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼)

2:不影响计算效率

2:让程序在后台跑后,不会占据终端,我们可以用终端做别的事情。

&

在您执行的程序后面加上 &,可以把当前命令放到后台执行,但是退出终端的时候,当前程序会退出

1
watch  -n 10 sh  test.sh  &  #每10s在后台执行一次test.sh脚本

ctrl + z

可以将一个正在前台执行的命令放到后台,并且处于暂停状态。

jobs

查看当前有多少在后台运行的命令

jobs -l选项可显示所有任务的PIDjobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell`` 从当前的shell`环境已知的列表中删除任务的进程标识。

nohup

nohup最简单暴力,让程序使用在后台执行,就算关闭了当前的终端也执行(&是做不到的)。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。关闭中断后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)。

1
ps -aux | grep "test.sh"  #a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分

setsid

nohup 通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点

1
2
setsid ping blog.yahui.wang
ps -ef |grep blog.yahui.wang

输出

1
2
xxx    77335      1  0 13:13 ?        00:00:00 ping www.ibm.com
xxx 77445 77359 0 13:14 pts/2 00:00:00 grep --color=auto www.ibm.com

值得注意的是,它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。可以自己动手将此例与nohup 例中的父 ID 做比较。体会更多。

disown

如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。

在我们的日常工作中,我们可以用 CTRL-z 来将当前进程挂起到后台暂停运行,执行一些别的操作,然后再用 fg 来将挂起的进程重新放回前台(也可用 bg 来将挂起的进程放在后台)继续运行。这样我们就可以在一个终端内灵活切换运行多个任务,这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时,光标定位仍然停留在上次挂起时的位置,避免了重新定位的麻烦。

1.用disown -h jobspec 来使某个作业忽略HUP信号。
2.用disown -ah 来使所有的作业都忽略HUP信号。
3.用disown -rh 来使正在运行的作业忽略HUP信号。

需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。

但是还有一个问题,这种方法的操作对象是作业,如果我们在运行命令时在结尾加了”&”来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!

CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec 来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。

screen

我们已经知道了如何让进程免受 HUP 信号的影响,但是如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呢?

此时最方便的方法就是 screen 了。简单的说,screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen 的参数很多,具有很强大的功能,我们在此仅介绍其常用功能以及简要分析一下为什么使用 screen 能够避免 HUP 信号的影响。

使用 screen 很方便,有以下几个常用选项:

  • 用screen -dmS session name 来建立一个处于断开模式下的会话(并指定其会话名)。
  • 用screen -list 来列出所有会话。
  • 用screen -r session name 来重新连接指定会话。
  • 用快捷键CTRL-a d 来暂时断开当前会话。

参考:
Linux 技巧:让进程在后台可靠运行的几种方法

htop是一个Linux进程监视工具,它是top命令的替代工具,它是Linux和Unix操作系统中的标准和默认进程监视工具。但是CentOS 7上的htop更易于用户使用,并且与Linux的top命令相比,输出更容易阅读。
在本教程中,我们将学习如何使用yum install命令和epel存储库在CentOS 7上安装htop。
在CentOS 7上安装htop我们想添加CentOS epel版本库,因为htop软件包没有默认的CentOS yum版本库。

安装Epel版本

首先,启用CentOS 7上的epel版本。

1
sudo yum -y install epel-release

用Yum命令安装htop

现在我们可以使用yum install命令安装CentOS htop。

1
sudo yum -y install htop

现在开始htop程序,打开Linux终端并键入htop

您可以看到htop过程监控工具的输出更具可读性,易于理解。

总结:htop CentOS 7

在本教程中,我们使用epel存储库在Linux CentOS 7上安装了htop。

首先,我们启用epel-release,然后使用yum命令安装htop(没有epel-release,您将收到以下错误“No package htop available”)。

我们也可以用同样的方法在CentOS 6.5及以前的版本上安装htop。

附:编译方式安装Htop

1
2
3
4
5
6
# 安装GCC 和编译Linux内核的库
yum install -y gcc ncurses-devel
wget http://sourceforge.net/projects/htop/files/latest/download
tar -zxf download
cd htop-1.0.2
./configure && make && make install