在Linux上用Nginx部署ASP.NET Core

翻译Host ASP.NET Core on Linux with Nginx

在Ubuntu 16.04服务器上配置一个production-ready的ASP.NET Core环境。

  • 把一个已经存在的ASP.NET Core应用放在一个反向代理服务器后面。

  • 配置一个反向代理服务器来发送请求到Kestrel网络服务器。

  • 确保网络应用在系统启动时作为Daemon运行

  • 配置一个进程管理工具来帮助重启网络应用

先决条件

  • 拥有一个sudo权限的标准用户可以访问Ubunut 16.04服务器

  • 一个已经存在的ASP.NET Core应用

复制应用

从开发环境运行dotnet publish来把一个应用打包到一个self-contained目录里,这样它可以在服务器上运行。

用一些工具(SCP, FTP)把ASP.NET Core应用拷贝到服务器。测试应用,例如:

  • 从命令行运行donet <app_assembly>.dll

  • 在浏览器中,导航到http://<serveraddress>:<port>来确认应用在Linux上工作。

配置一个反向代理服务器

反向代理是一个通用的设置,用来服务动态网络应用。反向代理终止HTTP请求并且把它发送到ASP.NET Core应用中。

为什么使用反向代理服务器?

Kestrel是一个ASP.NET Core应用,可以很好的服务动态内容的。然而,网络服务功能不如IIS, Apache或者Nginx丰富。反向代理服务器可以减轻HTTP服务器的工作,比如服务静态内容,缓存请求,压缩请求和SSL termination。反向代理服务器可能在一个专用的机器,也可能被部署在HTTP服务器上。

这篇文章,Nginx和HTTP服务运行在一台服务器上。

因为请求被反向代理发送,从Microsoft.AspNetCore.HttpOverrides包来使用Forwarded Headers中间件。这个中间件更新Request.Scheme, 使用X-Forwarded-Proto头,以便重定向链接和其他的安全策略能正确的工作。

当使用任何认证的中间件时,Forwarded Headers中间件必须首先运行。 这个顺序确保认证中间件可以销毁头的值并且生成正确的重定向链接。

在调用UseAuthentication或者类似的认证中间件前,在Startup.Configure中调用UseForwardedHeaders方法。配置中间件发送X-Forwarded-For和X-Forwarded-Proto头。

//ASP.NET Core 2.x
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.UseAuthentication();

如果ForwardedHeadersOptions中没有被指定的中间件,发送的默认的头是空。

安装Nginx

sudo apt-get install nginx

如果需要有选择的安装Nginx模块,可能必须需要从源码去build。

使用apt-get来安装Nginx。安装程序会创建一个系统的初始化的脚本,用来在系统启动时,Nginx可以作为Daemon运行起来。因为Nginx是第一次被安装,需要明确的启动它:

sudo service nginx start

确认浏览器显示Nginx默认的着陆页。

配置Nginx

为了配置Nginx作为反向代理来发送请求给你的ASP.NET Core应用,修改/etc/nginx/sites-available/default。用文本编辑器打开它,把它的内容替换为下面的内容:

server {
    listen        80;
    server_name   example.com *.example.com;
    location / {
        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $http_host;
        proxy_cache_bypass $http_upgrade;
    }
}

当没有server_name匹配,Nginx会使用default server。如果没有定义default server,在配置文件里的第一个server就是默认服务器。最佳实践是,在你的配置文件里添加一个指定的默认服务器,返回状态码为444。默认服务器配置例子:

server {
    listen   80 default_server;
    # listen [::]:80 default_server deferred;
    return   444;
}

用了前面的配置文件和默认服务器,Nginx接受80端口的Host头是example.com或者*.example.com的流量。不匹配这些hosts的请求不会被发送到Kestrel。Nginx发送匹配的请求给http://localhost:5000Nginx是如何处理请求的

一旦Nginx配置建好了,运行sudo nginx -t来确认配置文件的语法。如果配置文件语法测试成功了,运行sudo nginx -s reload来让Nginx加载这些改变。

监控应用

这个服务器可以把http://<serveraddress>:80的请求发送到运行在http://127.0.0.1:5000的ASP.NET Core应用。然而,Nginx没有管理Kestrel进程。可以使用systemd来创建一个服务文件,启动并且监控后台运行的网络应用。Systemd是一个初始化系统,提供了很多有用的功能用来启动,停止和管理进程。

创建服务文件

创建一个定义服务的文件:

sudo vi /etc/systemd/system/kestrel-hellomvc.service

下面是一个应用的服务文件的例子:

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/var/aspnetcore/hellomvc
ExecStart=/usr/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
Restart=always
RestartSec=10  # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

注意: 如果配置文件里没有使用www-data用户,那么这里定义的用户必须先被创建并且给予合适的权限。Linux是一个大小写敏感的文件系统。把ASPNETCORE_ENVIRONMENT设置为"Production",应用会寻找appsettings.Production.json配置文件,而不是appsettings.production.json。

保存文件并且激活服务

systemctl enable kestrel-hellomvc.service

启动服务并且确认它正在运行。

systemctl start kestrel-hellomvc.service
systemctl status kestrel-hellomvc.service

● kestrel-hellomvc.service - Example .NET Web API App running on Ubuntu
    Loaded: loaded (/etc/systemd/system/kestrel-hellomvc.service; enabled)
    Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
  Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-hellomvc.service
            └─9021 /usr/local/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll

反向代理配置好了并且Kestrel通过systemd管理,这个网络应用就配置完了并且可以从本机的浏览器http://localhost来访问。禁用任何可能阻塞的防火墙配置,它也可以被远程的机器访问。分析响应头,这个服务头显示ASP.NET Core应用被Kestrel服务。

HTTP/1.1 200 OK
Date: Tue, 11 Oct 2016 16:22:23 GMT
Server: Kestrel
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked

查看日志

因为Kestrel网络应用使用systemd管理,所有的事件和进程被记录到一个中心日志。然而,这个日志包含了所有的被systemd管理的服务和进程。为了看kestrel-hellomvc.service-specific的日志,使用下面的命令:

sudo journalctl -fu kestrel-hellomvc.service

为了进一步过滤,时间选项--since today--until 1 hour ago或者这些的组合都可以减少返回的内容。

sudo journalctl -fu kestrel-hellomvc.service --since "2016-10-18" --until "2016-10-18 04:00"

应用安全

激活AppArmor

Linux Security Modules (LSM)是一个框架,从Linux 2.6以后成文Linux内核的一部分。LSM支持不同的安全模块的实现。AppArmor 是一个实现了管制程序访问有限资源的系统。确保AppArmor被激活并且正确的配置。

配置防火墙

关闭所有的没有被使用的多余的端口。Uncomplicated firewall (ufw)提供了一个iptables的前端,通过提供命令行接口来配置防火墙。确保ufw的配置允许需要的端口被打开。

sudo apt-get install ufw
sudo ufw enable

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Nginx的安全

默认的Nginx没有激活SSL。为了激活额外的安全功能,可以从源码build。

下载源码并且安装build的依赖

# Install the build dependencies
sudo apt-get update
sudo apt-get install build-essential zlib1g-dev libpcre3-dev libssl-dev libxslt1-dev libxml2-dev libgd2-xpm-dev libgeoip-dev libgoogle-perftools-dev libperl-dev

# Download Nginx 1.10.0 or latest
wget http://www.nginx.org/download/nginx-1.10.0.tar.gz
tar zxf nginx-1.10.0.tar.gz
改变Nginx响应名字
Edit src/http/ngx_http_header_filter_module.c:

static char ngx_http_server_string[] = "Server: Web Server" CRLF;
static char ngx_http_server_full_string[] = "Server: Web Server" CRLF;
配置可选项和build

PCRE库对正则表达式是必须的。正则表达式在location指令中给ngx_http_rewrite_module使用。http_ssl_module添加了HTTPS协议的支持。

可以考虑使用一个网络应用防火墙(ModSecurity)来加强应用的安全。

./configure
--with-pcre=../pcre-8.38
--with-zlib=../zlib-1.2.8
--with-http_ssl_module
--with-stream
--with-mail=dynamic
配置SSL
  • 通过指定一个有效的,由一个可信任证书权威签发的证书,配置服务器来监听在443端口的HTTPS流量。

  • 在/etc/nginx/nginx.conf文件中添加配置,比如选择一个更强的cipher并且把HTTP全部重定向到HTTPS。

  • 添加一个HTTP Strict-Transport-Security (HSTS)头来确保所有的由客户端产生的请求只能通过HTTPS。

  • 如果将来要禁用SSL,就不添加Strict-Transport-Security头或者选择一个合适的max-age

添加/etc/nginx/proxy.conf配置文件:

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto $scheme;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

编辑/etc/nginx/nginx.conf配置文件。例子包含了http和server部分:

http {
    include    /etc/nginx/proxy.conf;
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    server_tokens off;

    sendfile on;
    keepalive_timeout 29; # Adjust to the lowest possible value that makes sense for your use case.
    client_body_timeout 10; client_header_timeout 10; send_timeout 10;

    upstream hellomvc {
        server localhost:5000;
    }

    server {
        listen *:80;
        add_header Strict-Transport-Security max-age=15768000;
        return 301 https://$host$request_uri;
    }

    server {
        listen *:443    ssl;
        server_name     example.com;
        ssl_certificate /etc/ssl/certs/testCert.crt;
        ssl_certificate_key /etc/ssl/certs/testCert.key;
        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_ecdh_curve secp384r1;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on; #ensure your cert is capable
        ssl_stapling_verify on; #ensure your cert is capable

        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        #Redirects all traffic
        location / {
            proxy_pass  http://hellomvc;
            limit_req   zone=one burst=10 nodelay;
        }
    }
}
点击劫持

Clickjacking是一个恶意的技术,用来收集受感染的用户的点击。Clickjacking欺骗受害者点进受感染的网站。使用X-FRAME-OPTIONS来使网站安全。

编辑nginx.conf文件:

sudo vi /etc/nginx/nginx.conf

添加add_header X-Frame-Options "SAMEORIGIN"这行并且保存文件,然后重启Nginx。

MIME-type嗅探

这个头阻止了大部分浏览器从MIME-sniffing一个远离声明类型的响应,因为这个头指明浏览器不会覆盖响应内容类型。用了nosniff选项,如果这个服务器说内容是"text/html", 浏览器会把内容作为"text/html"发送。

编辑nginx.conf文件:

sudo vi /etc/nginx/nginx.conf

添加add_header X-Content-Type-Options "nosniff"这一行并且保存文件,然后重启Nginx。


Liunx ASP.NET Core Nginx

这篇文章: 有用 无用
创建 2018-04-25 02:35:44 / 更新 2018-04-25 02:54:13

说说Linux下的文件和目录的权限

文件的权限

r 可以读取文件
w 可以编辑该文件的内容(但不能删除该文件)
x 该文件可以被系统执行

目录的权限

 r 可以读取目录结构列表,表示可以查询该目录下的文件名数据
 w 在该目录内新建新的文件和目录,删除该目录内已经存在的文件和目录(不论该文件的权限为何),转移该目录内的文件和目录的位置,重命名该目录内的文件和目录
 x 是否可以进入(cd)该目录,如果没有x权限,无法读取该目录下的文件的内容

总结

如果你要读取一个文件的内容,不仅要拥有文件的 r 权限,而且要拥有文件所在目录的 x 权限

如果你要删除一个文件,只需要拥有该文件所在目录的 w 权限即可


Liunx

这篇文章: 有用 无用
创建 2017-08-28 14:47:10 / 更新 2018-04-20 08:49:17

说说Linux下的mv命令

当我们使用mv命令移动文件overwrite的时候,会不会有提示呢?

mv 有两个 option

-f # do not prompt before overwriting
-i # prompt before overwrite

此外我们还需要使用

$ alias mv

来查看mv命令有没有设置别名


Liunx

这篇文章: 有用 无用
创建 2017-07-12 03:01:31 / 更新 2018-04-20 08:49:17

说说Linux下的diff命令

diff 的语法

diff [options] from-file(修改前的文件) to-file(修改后的文件)

diff 的 options

-u  # Use the unified output format.
-r  # When compare directories, recursively compare any subdirectories found.
-q  # Report only whether the files differ, not the details of the differences.

diff -u from-file to-file
git diff from-file to-file # 如果安装了git

Liunx

这篇文章: 有用 无用
创建 2017-07-07 02:16:50 / 更新 2018-04-20 08:49:17

开机遇到grub rescue怎么办?

  1. 在grub rescue>下输入:

      ls

      列出硬盘分区信息,例如:

      (hd0) (hd0,msdos10) (hd0,msdos9) (hd0,msdos8) (hd0,msdos7) (hd0,msdos6) (hd0,msdos5) (hd0,msdos1)

  2. 寻找grub所在的分区

      如果/boot单独分区了,输入 ls (hd0,X)/grub

      如果没有对/boot/单独分区,输入 ls (hd0,X)/boot/grub

      如果出现以下信息,表示找到了grub所在的分区

      ./ ../gfxblacklist.txt unicode.pf2 i386-pc/ locale/ fonts/ grubenv grub.cfg

  3. 设置 root, prefix,载入模块

    3.1) set root=(hd0,X)

    3.2) 如果/boot单独分区,输入set prefix=(hd0,5)/grub,如果没有对/boot单独分区,输入set prefix=(hd0,5)/boot/grub

    3.3) insmod normal # 实际我使用的是insmod /grub/i386-pc/normal.mod(/boot单独分区了)

    3.4) normal

    3.5) 选择进入ubuntu 

  4. 修复grub

    4.1) sudo update-grub

    4.2) sudo grub-install /dev/sda

Done


Liunx

这篇文章: 有用 无用
创建 2016-12-17 05:57:34 / 更新 2018-04-20 08:49:17

Linux 关于系统的一些命令

# 查看系统开机时间
who -b /var/log/wtmp
who -b

# 查看进程树
ps axuwwf

# 查看进程运行的时间
ps -eo pid,etime,cmd

# 系统日志的查看

tail -f /var/log/{kern.log,dmesg,syslog}

dmesg

dmesg -c # clear kernel ring buffer message to '/var/log/dmesg' file

dmesg -wH # since kernel 3.5.0 

watch -n 1 "dmesg | tail -n $((LINES - 6))"

# netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
# -p Show the PID and name of the program to which each socket belongs.
# -a Show both listening and non-listening sockets. 
# -l Show only listening sockets. (These are omitted by default.)
# -n Show numerical addresses instead of trying to determine symbolic host, port or user names.
# --tcp|-t
# --udp|-u    
netstat -a -p | grep LISTEN

# 查找 process IDs
# pgrep
# -f The pattern is normally only matched against the process name.  When -f is set, the full command line is used.
pgrep -u root,www-data memcached
kill `pgrep memcached`
killall memcached

# find the process ID of a running program
# pidof
kill $(pidof memcached)

# diff
diff -u -d

Liunx

这篇文章: 有用 无用
创建 2016-11-29 02:28:34 / 更新 2018-04-20 08:49:17

Linux 关于账户的一些命令

# 创建一个组
# groupadd 
groupadd dev

# addgroup
addgroup dev

# 创建一个用户
# useradd - create a new user or update default new user information
useradd -g dev -m -d /home/sxn -s /bin/bash sxn # 如果不指定-s的话,会默认使用/etc/default/useradd里面的SHELL设置

# adduser
adduser --ingroup dev --home /home/sxn --shell /bin/bash sxn # 如果不指定--shell的话,会默认使用/etc/adduser.conf里面的DSHELL设置

# 删除一个用户
userdel sxn
deluser sxn

# 查看用户信息
id - print real and effective user and group IDs  # id 

# 如何修改hostname
# 1) 临时修改主机名
sudo hostname $hostname

# 2) 永久修改主机名
sudo vi /etc/hostname # 打开/etc/hostname文件,将原有的主机名更换为现有的主机名
sudo vi /etc/hosts # 将 ip 地址对应的原有主机名修改为现有主机名

Liunx

这篇文章: 有用 无用
创建 2016-11-29 02:21:25 / 更新 2018-04-20 08:49:17

硬盘的挂载

什么是 sda sdb

/dev/sda 表示第一块硬盘

/dev/sda1 表示第一块硬盘的第一个分区

/dev/sda2 表示第一块硬盘的第二个分区

/dev/sdb 表示第二块硬盘

怎样查看硬盘

sudo fdisk -l

怎样查看已经挂载的硬盘

df -h    
mount
nfsstat -m
cat /etc/mtab
cat /etc/fstab

怎样挂载硬盘

# -o 如果有多个参数,用","隔开
mount -a # 依照配置文件 /etc/fstab 的数据将所有的未挂载的磁盘都挂载上来
mount /dev/sdc2 /mnt/sdc2 # 挂载Ext2/Ext3文件系统
mount -t vfat -o iocharset=cp950 /dev/sdb1 /mnt/flash  # 挂载U盘

怎样将设备文件卸载

unmount [-fn] 挂载点 
-f 强制卸载 
-n 不更新 /etc/mtab 的情况下卸载    

unmount /mnt/flash

文件系统 NFS

Network File System

挂载上了,但是 df -h 看不到

挂载的时候需要添加 -o nfsvers=2 或者 -o vers=2

nfsvers=2 or nfsvers=3 — Specifies which version of the NFS protocol to use. This is useful for hosts that run multiple NFS servers. If no version is specified, NFS uses the highest supported version by the kernel and mount command. This option is not supported with NFSv4 and should not be used.

Liunx

这篇文章: 有用 无用
创建 2016-10-31 04:58:22 / 更新 2018-04-20 08:49:17

curl 的一些用法

  1. curl -o|--output $filename www.baidu.com 或 curl www.baidu.com > filename # 保存网页至filename

  2. curl -O|--remote-name $url # e.g. curl -O http://www.etao.com/sitemap.xml -O http://www.amazon.com/robots.txt

  3. curl -I|--head baidu.com # 发送 HEAD 方法给 http server, 显示 header 信息

  4. curl -i|--include $url # 输出中包含 HTTP-header 信息

  5. curl -D|--dump_header $filename $url # 把 response header 信息写入文件

  6. curl -L|--location jd.com # follow redirect

  7. curl -A|--user-agent "[User Agent]" baidu.com # 设置User Agent

  8. curl -e|--referer $referer $url # 设置 $referer

  9. curl -b|--cookie "NAME1=VALUE1; NAME2=VALUE2" $url # 设置 cookie

  10. curl -H|--header 'Content-type:application/xml' $url # 设置 request header 信息

  11. curl -v|--verbose $url # curl HTTP 详情

  12. curl -x|--proxy <[protocol://][user@password]proxyhost[:port]>

    # This option overrides existing environment variables that set the proxy to use. If there's an environment variable setting a proxy, you can set proxy to "" to override it.

  13. curl --socks5 127.0.0.1:7070

  14. curl -w|--write-out <format>

    curl -w 'DNS lookup: %{time_namelookup}\nTCP handshake: %{time_connect}\nSSL handshake: %{time_appconnect}\nPre tran:%{time_pretransfer}\nTran:%{time_starttransfer}\n' https://www.baidu.com # time_connect变量表示TCP握手的耗时,time_appconnect变量表示SSL握手的耗时 `

    POST
  15. curl -X|--request # e.g: curl -X POST

  16. curl --data-binary @$file|$str $url # to post data purely binary, post $url $file or $str

  17. curl -d|--data|--data-ascii @$file|$str $url # post $url $file or $str

  18. curl --data-urlencode @$file|$str $url # (HTTP) similar to the other --data options with the exception that this performs URL-encoding.

  19. curl -F|--form # POST data 使用 Content-Type multipart/form-data.

    e.g: curl -F password=@/etc/passwd www.foo.com

    e.g: curl -F "web=@index.html;type=text/html" www.foo.com

    e.g: curl -F "file=@localfile;filename=nameinpost" www.foo.com

    e.g: curl -F file=@file1 -F file=@file2 www.foo.com

如何给curl添加代理
vi .curlrc
添加socks5 = "127.0.0.1:1080"

Liunx

这篇文章: 有用 无用
创建 2014-02-25 12:50:35 / 更新 2018-04-20 08:49:17

ubuntu 的一些设置和快捷键

这些设置和快捷键都是在 Unity 3D 下的

$ echo $DESKTOP_SESSION # 显示 ubuntu 则是 Unity 3D

长按 Super键(就是win键)就会显示快捷键列表


Ctrl+Super+d 最小化所有窗口

Ctrl+Super+Up 最大化当前窗口

Ctrl+Super+Down 恢复或最小化当前窗口


怎样横向平铺窗口?

试试 Ctrl+Alt+数字小键盘8 和 Ctrl+Alt+数字小键盘2

怎样纵向平铺窗口?

试试 Ctrl+Super+左方向键 和 Ctrl+Super+右方向键


怎样在左侧 Launcher 中显示 Show Desktop?

1) sudo apt-get install compizconfig-settings-manager

2) 打开 CompizConfig Settings Manager, 找到 Ubuntu Unity Plugin, 点击 Experimental, 勾选 Show "Desktop Icon" in the launcher


怎样自动登录?

1)sudo vi /etc/lightdm/lightdm.conf

2)添加

autologin-user=<username>
autologin-user-timeout=0

怎样用命令开关屏幕?

xset dpms force off
xset dpms force on

加入crontab, 一小时休息 5 分钟
30 9-18/1 * * * DISPLAY=:0 /usr/bin/xset dpms force off 
35 9-18/1 * * * DISPLAY=:0 /usr/bin/xset dpms force on

怎样禁用Alt弹出HUD?

System Settings -> Keyboard -> Short-cuts -> Click "Key to show the HUD" -> Pressing "Backspace"

怎样只升级某个软件?

apt-get --only-upgrade install chromium-browse  # 只升级 chrome 浏览器
apt-get --only-upgrade install firefox  # 只升级 firefox

Liunx

这篇文章: 有用 无用
创建 2014-01-14 11:54:46 / 更新 2018-04-20 08:49:17

linux tar命令

tar [ctzxvpf] 压缩文件

c --create: 建立一个压缩文件

x --extract : 解开一个压缩文件

t --list : 查看压缩文件里面的文件

z --gzip : 是否同时具有 gzip 的属性或是否需要用 gzip 压缩

j --bzip2 : 是否同时具有 bzip2 的属性或是否需要用 bzip2 压缩

v --verbose : 解压或压缩的过程中显示文件

f --file : 使用档名,在 f 之后要立即接档名,不要再加参数

p --preserver : 保留原文件属性

-C --directory : 指定解压目录


Liunx

这篇文章: 有用 无用
创建 2012-09-04 13:26:11 / 更新 2018-04-20 08:49:17

linux 的一些命令

# watch - execute a program periodically, showing output fullscreen
watch -n 1 date # 每秒执行一次 date 命令
watch -n 1 "date +%T"

# netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
# -p Show the PID and name of the program to which each socket belongs.
# -a Show both listening and non-listening sockets. 
# -l Show only listening sockets. (These are omitted by default.)
# -n Show numerical addresses instead of trying to determine symbolic host, port or user names.
# --tcp|-t
# --udp|-u    
netstat -a -p | grep LISTEN

# 打印文件第3行
sed -n '3p' file

# 文件去空行
grep -v '^$' file > newfile

# 查找 process IDs
# pgrep
# -f The pattern is normally only matched against the process name.  When -f is set, the full command line is used.
pgrep -u root,www-data memcached
kill `pgrep memcached`
killall memcached

# find the process ID of a running program
# pidof
kill $(pidof memcached)

# 查看系统开机时间
who -b /var/log/wtmp
who -b

# 查看进程树
ps axuwwf

# 查看进程运行的时间
ps -eo pid,etime,cmd

# dmesg

Liunx

这篇文章: 有用 无用
创建 2012-05-21 02:07:50 / 更新 2018-04-20 08:49:17

ubuntu 命令 dpkg -l

dpkg -l

每条记录对应一个软件包,每条记录的第一, 二, 三个字符是软件包的状态标识, 后边依此是软件包名称,版本号, 和简单描述。

关于每个状态,可以参考

man dpkg-query

关于每个状态的描述,可以参考

man dpkg # 搜索 Package states

第一个字符为期望值,它包括:

  • u (Unknown) 状态未知,这意味着软件包未安装,并且用户也未发出安装请求。
  • i (Install) 用户请求安装软件包。
  • r (Remove) 用户请求卸载软件包。
  • p (Purge) 用户请求清除软件包。
  • h (Hold) 用户请求保持软件包版本锁定。

第二个字符是软件包的当前状态,它包括:

  • n (Not-installed) 软件包未安装。
  • i (Installed) 软件包安装并完成配置。
  • c (Config-files) 软件包以前安装过,现在删除了,但是它的配置文件还留在系统中。
  • U (Unpacked) 软件包被解包,但还未配置。
  • F (Half-configured) 试图配置软件包,但是失败了。
  • H (Half-installed)软件包安装,但是但是没有成功。

第三个字符是错误状态,有四种状态。第一种状态标识没有问题,为空。其它三种包括:

  • R (Reinst-required) 软件包被破坏

Liunx

这篇文章: 有用 无用
创建 2012-03-04 06:29:46 / 更新 2018-04-20 08:49:17