导航:首页 > 操作系统 > linux3690

linux3690

发布时间:2023-05-23 05:46:54

A. C语言分布式系统中的进程标识


本文假定一台机器 (host) 只有一个 IP,不考虑 multihome 的情况。同时假定分布式系统中的每一台机器都正确运行了 NTP,各台机器的时间大体同步。
“进程 process”是操作系统的两大基本概念之一,指的是在内存中运行的程序。在日常交流中,“进程”这个词通常不止这一个意思。有时候我们会说 “httpd 进程”或者“mysqld 进程”,指的其实是 program,而不一定是特指某一个“进程”——某一次 fork() 系统调用的产物。一个“httpd 进程”重启了,它还是“一个 httpd 进程”。本文讨论的是,如何为一个程序每次运行 的进程取一个唯一标识符。也就是说,httpd 程序第一次运行,进程是 httpd_1,它原地重启了,进程是 httpd_2。
本文所指的“进程标识符”是用来唯一标识一个程序的“一次运行”的。每次启动一个进程,这个进程应该被赋予一个唯一的标识符,与当前正在运行的所有进程都不同;不仅如此,它应该与历史上曾经运行过,目前已消亡的进程也都不同(这两条的直接推论是,与将来可能运行的进程也都不同)。“为每个进程命名”在分布式系统中有相当大的实际意义,特别是在考虑 failover 的时候。因为一个程序重启之后的新进程和它的“前世进程”的状态通常不一样,凡是与它打交道的其他进程(s)最好能通过它的进程标识符变更来很容易地判断该程序已经重启,而采取必要的救灾措施,防止搭错话。
本文先假定每个服务端程序的端口是静态分配的,在公司内部有一个公用 wiki 来记录端口和程序的对应关系(然后通过 NIS 或 DNS 发布)。比如端口 11211 始终对应 memcached,其他程序不会使用 11211 端咐迟口;3306 始终留给 mysqld;3690 始终留给 svnserve。在分布式系统的初级阶段,这是通常的做法;到了高级阶段,多半会用动态分配端口号,因为端口号只有 6 万多个,是稀缺资源,在公司内部也有分配完的一天。本文只考虑 TCP 协议,不考虑 UDP 协议,“端口”都指的是 TCP 端口。
另外,我们假定在一台机器上,一个 listening port 同时只能由一个进程使用,不考虑古老的 listen() + fork() 模型(多个进程可以 accept 同一个端口上进来的连接),关于这点陈硕已经写的很多,见《linux 新增系统调用的启示 》《多线程服务器的适用场合 》。
错误做法
在分布式系统中,如何指涉(refer to)某一个进程呢,或者说一个进程如衡答李何取得自己的全局标识符 (以下简称 gpid)?容易想到的有两种做法:
*ip:port (port 是这个进程对外提供网络服务的端口号,一般就是它的 tcp listening port)
*host:pid
而这两种做法都有问题。为什么?
如果进程本身是无状态的,或者重启了也没有关系,那么用 ip:port 来标识一个“服务”是没问题的,比如常见的 httpd 和 memcached 都可以用它们的惯用 port (80 和 11211)来标识。我们可以在其他程序里安全地引用(refer to)“运行在 10.0.0.5:80 的那个 http 服务器”,或者“10.0.0.6:11211 的 memcached”,就算这两个 service 重启了,也不会有太恶劣的后果,大不了客户端重试一下,或者自动切换到备用地址。
如果服务是有状态的,那么 ip:port 这种标识方法就有大问题,因为客户端无法区分从头到尾和自己打交道的是一个进程还是先后多个进程。在开发服务端程序的时候,为了能快速重启,我们一般都会设置 SO_REUSEADDR,这样的结果是前一秒钟站在 10.0.0.7:8888 后面的进程和后一秒钟占据 10.0.0.7:8888 的进程可能不相同——服务端程序快速重启了。
比方说,考虑一个类似 GFS 的分布式文件系统的 master,如果它仅以 ip:port 来标识自己,然后它举册向 shadows (不是 chunk server)下达同步指令,那么 shadows 如何得知 master 是不是已经重启呢?发指令的是 master 的“前世”还是“今生”?是不是应该拒绝“前世”的遗命?
如果考虑改成 host:pid 这种标识方式会不会好一点?我认为换汤不换药,因为 pid 的状态空间很小,重复的概率比较大。比如 Linux 的 pid 的最大值是 32768 (/proc/sys/kernel/pid_max),一个程序重启之后,获得与“前世”相同 pid 的概率是 1/32768。或许有读者不相信重启之后 pid 会重复,因为 pid 是递增的,遇到上限再回到目前空闲的最小 pid。考虑一个服务端程序 A,它的 pid 是 1234,它已经稳定运行了好几天,这期间,pid 已经增长了几个轮回(因为这台机器时常会启动一些 scripts 执行一些辅助工作)。在 A 崩溃的前一刻,最近被使用的 pid 已经回到了 1232,当 A 崩溃之后,某个守护进程启动一个脚本(pid = 1233)来清理 A 的 log,然后再重启 A 程序;这样一来,重启之后的 A 程序的 pid 碰巧和它的前世相同,都是 1234。也就是说,用 host:pid 不能唯一标识进程。
那么合在一起,用 ip:port:pid 呢?也不能做到唯一。它和 host:pid 面临的问题是一样的,因为 ip:port 这部分在重启之后不会变,pid 可能轮回。
我猜这时有人会想,建一个中心服务器,专门分配系统的 gpid 好了,每个进程启动的时候向它询问自己的 gpid。这错得更远:这个全局 pid 分配器的 gpid 由谁来定?如何保证它分配的 gpid 不重复(考虑这个程序也可能意外重启)?它是不是成为系统的 single point of failure?如果要对该 gpid 分配器做容错,是不是面临分布式系统的基本问题:状态迁移?
还有一种办法,用一个足够强的随机数做 gpid,这样一来确实不会重复,但是这个 gpid 本身也没有多大额外的意义,不便于管理和维护(比方说根据 gpid 找到是哪个机器上运行的哪个进程)。
正确做法:以四元组 ip:port:start_time:pid 作为分布式系统中进程的 gpid,其中 start_time 是 64-bit 整数,表示进程的启动时刻(UTC 时区,muo::Timestamp)。理由如下:
*容易保证唯一性。如果程序短时间重启,那么两个进程的 pid 必定不重复(还没有走完一个轮回:就算每秒创建 1000 个进程,也要 30 多秒才会轮回,而以这么高的速度创建进程的话,服务器已基本瘫痪了。);如果程序运行了相当长一段时间再重启,那么两次启动的 start_time 必定不重复。(见下文关于时间重复的解释)
*产生这种 gpid 的成本很低(几次低成本系统调用),没有用到全局服务器,不存在 single point of failure。
*gpid 本身有意义,根据 gpid 立刻就能知道是什么进程(port),运行在哪台机器(ip),是什么时间启动的,在 /proc 目录中的位置 (/proc/pid) 等,进程的资源使用情况也可以通过运行在那台机器上的监控程序报告出来。
*gpid 具有历史意义,便于将来追溯。比方说进程 crash,那么我知道它的 gpid,就可以去历史记录中查询它 crash 之前的 cpu/mem 负载有多大。
如果仅以 ip:port:start_time 作为 gpid,则不能保证唯一性,如果程序短时间重启(间隔一秒或几秒),start_time 可能会往回跳变(NTP 在调时间)或暂停(正好处于闰秒期间)。关于时间跳变的问题留给下一篇博客《〈程序中的日期与时间〉第二章:计时与定时》,简单地说,计算机上的时钟不一定是单调递增的。
没有 port 怎么办?一般来说,一个网络服务程序会侦听某个端口来提供服务,如果它是个纯粹的客户端,只主动发起连接,没有主动侦听端口,gpid 该如何分配呢?根据陈硕在《分布式系统的工程化开发方法 》一文中的观点“在程序里内置 http 服务器”,分布式系统中的每个长期运行的、会与其他机器打交道的进程都应该提供一个管理接口,对外提供一个维修探查通道,可以查看进程的全部状态。这个管理接口就是一个 TCP server,它会侦听某个 port。
使用这样的维修通道的一个额外好处是,可以自动防止重复启动程序。因为如果重复启动,bind 到那个运维 port 的时候会出错(端口已被占用),程序会立刻退出。更妙的是,不用担心进程 crash 没来得及清理锁(如果用跨进程的 mutex 就有这个风险),进程关闭的时候操作系统会自动把它打开的 port 都关上,下一个进程可以顺利启动。
进一步,还可以把程序的名称和版本号作为 gpid 的一部分,这起到锦上添花的作用。
TCP 协议的启示
我在《分布式系统的工程化开发方法 》中提到“从 TCP 协议能学到什么?”,今天讲的这个 gpid 其实也是由 TCP 协议启发而来。TCP 用 ip:port 来表示 endpoint,两个 endpoint 构成一个 socket。这似乎符合一开始提到的以 ip:port 来标识进程的做法。其实不然。在发起 TCP 连接的时候,为了防止前一次同样地址的连接(相同的 local_ip:local_port:remote_ip:remote_port)的干扰(称为 wandering plicates ,即流浪的 packets),TCP 协议使用 seq 号码(这种在 SYN packet 里第一次发送的 seq 号码称为 initial sequence number, ISN)来区分本次连接和以往的连接。TCP 的这种思路与我们防止进程的“前世”干扰“今生”很相像。内核每次新建 TCP 连接的时候会设法递增 ISN 以确保与上次连接最后使用的 seq 号码不同。相当于说把 start_time 加入到了 endpoint 之中,这就很接近我们后面提到的“正确的 gpid”做法了。(当然,原始 BSD 4.4 的 ISN 生成算法有安全漏洞,会导致 TCP sequence prediction attack,Linux 内核已经采用更安全的办法来生成 ISN。)

B. linux 下如何启动SVN服务。

先转到SVN的安装目录,比如,你安装在/home/svn 下面。然后转到bin目录下,在这里可以看见一个叫svnserve的文件,我们需要用这个来启动SVN服务。

C. 版本控制在软件开发中由谁管理

svn版本控制器安装 分类:学习园地Subversion 系统

多年来,并发版本系统(CVS)一直是在Linux上管理代码或者文本的标准。作为基于RCS上建立但却允许多用户没宏协作的系统而言,CVS记录所有文件的修改信息。这对于程序开发者、网络设计者和系统管理员而言,是非常有用的。
然亮基而,CVS逐渐显示出它的衰老,出现了相似的源代码管理软件。然而大多这种东西都是以牟利为主要目的的。
Subversion就是一种相对新鲜的源代码管理系统。虽然事实敬察谨上它还在不断的反展之中,但是Subversion已经是一个非常稳定而且成熟的产品。它是一个全新的系统,其功能可以和CVS媲美,同时,它要比CVS更直观,更容易操作。本文就Subversion的安装和一些特殊功能作一个介绍。

安装服务器端

第一步:下载Apache和SVN源码
从官方网站台下载httpd-2.0.52.tar.gz,subversion-1.2.3.tar.gz
(因为redhat 9默认安装的Apache没有并包含--enable-so选项,所以无法产生mod_dav_svn.没有这个模块,SVN就无法采用http方式运行,所以必须重新编译新的Apache)
以root身份执行:
#tar zxvf httpd-2.2.0.tar.gz
#cd httpd-2.2.0

#./configure --enable-dav --enable-so --enable-maintainer-mode
#make
#make install
此时会产生/usr/local/apache2目录,接着执行:
#tar zxvf subversion-1.2.3.tar.gz
#./configure --with-apxs=/usr/local/apache2/bin/apxs
# rm /usr/local/lib/libsvn*
# make clean && make && make install

此时会自动在/usr/local/apache2/conf/httpd.conf添加
LoadMole dav_svn_mole moles/mod_dav_svn.so
安装完成后,运行svnserver --version确认版本号1.2.3。
SVN服务器安装结束.

第二步,创建仓库 svnadmin create /home/svnrepo

/root/svnrepo为所创建仓库的路径,理论上可以是任何目录

第三步,修改配置文件/home/svnrepo/conf/svnserve.conf

代码

#去掉#[general]前面的#号
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access = none
#认证用户的权限,可以是read,write,none,默认为write
auth-access = write
#密码数据库的路径,去掉前面的#
password-db = passwd

注意:所有的行都必须顶格,否则报错。
建议:为了防止不必要的错误,建议你直接用我上面的内容覆盖掉文件原来的内容

第四步,修改配置文件passwd。

代码
[users]
sxy = sxy

注意
1. 一定要去掉[users]前面的#,否则svn只能以匿名用户登录,客户端不会出现登录窗口,除非你的anon不为none,否则将返回一个错误。
2. 这里的密码都是没有加密的,我按照一些教程所说的用htpasswd生成的密码无法使用。

第五步,启动svn服务

对于单个代码仓库

启动命令 svnserve -d -r /home/svnrepo --listen-host 192.168.100.200

其中-d表示在后台运行,-r指定服务器的根目录,这样访问服务器时就可以直接用svn://服务器ip来访问了。如果服务器有多ip的话--listen-host来指定监听的ip地址.

我们可以在svn客户端中通过svn://192.168.100.200来访问svn服务器

对于多个代码仓库,我们在启动时也可以用-r选项来指定服务器根目录,但访问时需要写上每个仓库相对于svn根目录的相对路径.

比如,我们有两个代码仓库/home/repoa和/home/repob,我们用svnserve -d -r /home --listen-host 192.168.100.200来启动,那么在客户端访问时可以用svn://192.168.100.200/repoa和svn://192.168.1.200/repob来分别访问两个项目

启动完成以后,我们可以用ps aux|grep svnserv来查看是否存在svnserve进程.

第六步 开放服务器端口

svn默认端口是3690,你需要在防火墙上开放这个端口。

/sbin/iptables -A INPUT -i eth0 -p tcp --dport 3690 -j ACCEPT

/sbin/service iptables save

你也可以通过svnserve的--listen-port选项来指定一个已经开放的其他端口,不过这样的话客户端使用也必须家上端口,如svn://192.168.100.200:9999/.

第七步,使用svn客户端导入项目

推荐使用客户端 http://tortoisesvn.tigris.org/

eclipse插件 http://subclipse.tigris.org/

附:svnserve [选项]

有效选项:
-d [--daemon] : 后台模式
--listen-port arg : 监听端口(后台模式)
--listen-host arg : 监听主机名或IP地址(后台模式)
--foreground : 在前台运行(调试时有用)
-h [--help] : 显示这个帮助
--version : 显示版本信息
-i [--inetd] : inetd 模式
-r [--root] arg : 服务根目录
-R [--read-only] : 不赞成;使用档案库配置文件
-t [--tunnel] : 隧道模式
--tunnel-user arg : 隧道用户名(模式是当前用户UID的名字)
-T [--threads] : 使用线程代替进程
-X [--listen-once] : 监听一次(调试时有用)

安装客户机端

window客户机:
直接安装TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi,方法同一般软件安装相同。
Linux客户机:
方法舆安装服务器相同。
(注意redhat 9默认安装的SVN版本为0.17.1,它的客户端命令svn无法舆新的SVN服务器通讯,必须重新安装)

我是从“上海全鼎软件学院”毕业的————————

D. linux 查看使用了多少SOCKET

Linux系统中,ss命令可用于查看系统的socket的状态。

1、命令格式:
ss [参数]
ss [参数] [过滤]
2、命令功能:
ss(Socket Statistics的缩写)命令可以用来获取 socket统计信息,此命令输出的结果类似于
netstat输出的内容,但它能显示更多更详细的 TCP连接状态的信息,且比 netstat 更快速高效。它使用了 TCP协议栈中
tcp_diag(是一个用于分析统计的模块),能直接从获得第一手内核信息,这就使得 ss命令快捷高效。在没有
tcp_diag,ss也可以正常运行。
3、命令参数:
-h, --help 帮助信息
-V, --version 程序版本信息
-n, --numeric 不解析服务名称
-r, --resolve 解析主机名
-a, --all 显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options 显示计时器信息
-e, --extended 显示详细的套接字(sockets)信息
-m, --memory 显示套接字(socket)的内存使用情况
-p, --processes 显示使用套接字(socket)的进程
-i, --info 显示 TCP内部信息
-s, --summary 显示套接字(socket)使用概况
-4, --ipv4 仅显示IPv4的套接字(sockets)
-6, --ipv6 仅显示IPv6的套接字(sockets)
-0, --packet 显示 PACKET 套接字(socket)
-t, --tcp 仅显示 TCP套接字(sockets)
-u, --udp 仅显示 UCP套接字(sockets)
-d, --dccp 仅显示 DCCP套接字(sockets)
-w, --raw 仅显示 RAW套接字(sockets)
-x, --unix 仅显示 Unix套接字(sockets)
-f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件
-F, --filter=FILE 从文件中都去过滤器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
4、使用实例:
显示TCP连接
命令:ss -t -a
输出:
代码如下:
[root@localhost ~]# ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 0 127.0.0.1:smux *:*
LISTEN 0 0 *:3690 *:*
LISTEN 0 0 *:ssh *:*

ESTAB 0 0 192.168.120.204:ssh 10.2.0.68:49368
[root@localhost ~]#

E. Linux怎么使用ss命令查看系统的socket状态

ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。(但仍然比 netstat要快。)

命令格式:
ss [参数]
ss [参数] [过滤]

2.命令功能:
ss(Socket Statistics的缩写)命令可以用来获取 socket统计信息,此命令输出的结果类似于 netstat输出的内容,但它能显示更多更详细的 TCP连接状态的信息,且比 netstat 更快速高效。它使用了 TCP协议栈中 tcp_diag(是一个用于分析统计的模块),能直接从获得第一手内核信息,这就使得 ss命令快捷高效。在没有 tcp_diag,ss也可以正常运行。

3.命令参数:
-h, --help 帮助信息
-V, --version 程序版本信息
-n, --numeric 不解析服务名称
-r, --resolve 解析主机名
-a, --all 显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options 显示计时器信息
-e, --extended 显示详细的套接字(sockets)信息
-m, --memory 显示套接字(socket)的内存使用情况
-p, --processes 显示使用套接字(socket)的进程
-i, --info 显示 TCP内部信息
-s, --summary 显示套接字(socket)使用概况
-4, --ipv4 仅显示IPv4的套接字(sockets)
-6, --ipv6 仅显示IPv6的套接字(sockets)
-0, --packet 显示 PACKET 套接字(socket)
-t, --tcp 仅显示 TCP套接字(sockets)
-u, --udp 仅显示 UCP套接字(sockets)
-d, --dccp 仅显示 DCCP套接字(sockets)
-w, --raw 仅显示 RAW套接字(sockets)
-x, --unix 仅显示 Unix套接字(sockets)
-f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件
-F, --filter=FILE 从文件中都去过滤器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
4.使用实例:
实例1:显示TCP连接
命令:ss -t -a
输出:
代码如下:
[root@localhost ~]# ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 0 127.0.0.1:smux *:*
LISTEN 0 0 *:3690 *:*
LISTEN 0 0 *:ssh *:*
ESTAB 0 0 192.168.120.204:ssh 10.2.0.68:49368
[root@localhost ~]#
实例2:显示 Sockets 摘要
命令:ss -s
输出:
代码如下:
[root@localhost ~]# ss -s
Total: 34 (kernel 48)
TCP: 4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 3《/p》 《p》Transport Total IP IPv6
* 48 - -
RAW 0 0 0
UDP 5 5 0
TCP 4 4 0
INET 9 9 0
FRAG 0 0 0
[root@localhost ~]#
说明:列出当前的established, closed, orphaned and waiting TCP sockets
实例3:列出所有打开的网络连接端口
命令:ss -l
输出:
代码如下:
[root@localhost ~]# ss -l
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 127.0.0.1:smux *:*
0 0 *:3690 *:*
0 0 *:ssh *:*
[root@localhost ~]#
实例4:查看进程使用的socket
命令:ss -pl
输出:
代码如下:
[root@localhost ~]# ss -pl
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 127.0.0.1:smux *:* users:((“snmpd”,2716,8))
0 0 *:3690 *:* users:((“svnserve”,3590,3))
0 0 *:ssh *:* users:((“sshd”,2735,3))
[root@localhost ~]#
实例5:找出打开套接字/端口应用程序
命令:ss -lp | grep 3306
输出:
代码如下:
[root@localhost ~]# ss -lp|grep 1935
0 0 *:1935 *:* users:((“fmsedge”,2913,18))
0 0 127.0.0.1:19350 *:* users:((“fmsedge”,2913,17))
[root@localhost ~]# ss -lp|grep 3306
0 0 *:3306 *:* users:((“mysqld”,2871,10))
[root@localhost ~]#
实例6:显示所有UDP Sockets
命令:ss -u -a
输出:
代码如下:
[root@localhost ~]# ss -u -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 127.0.0.1:syslog *:*
UNCONN 0 0 *:snmp *:*
ESTAB 0 0 192.168.120.203:39641 10.58.119.119:domain
[root@localhost ~]#
实例7:显示所有状态为established的SMTP连接
命令:ss -o state established ‘( dport = :smtp or sport = :smtp )’
输出:
代码如下:
[root@localhost ~]# ss -o state established ‘( dport = :smtp or sport = :smtp )’
Recv-Q Send-Q Local Address:Port Peer Address:Port
[root@localhost ~]#
实例8:显示所有状态为Established的HTTP连接
命令:ss -o state established ‘( dport = :http or sport = :http )’
输出:
代码如下:
[root@localhost ~]# ss -o state established ‘( dport = :http or sport = :http )’
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 75.126.153.214:2164 192.168.10.42:http
[root@localhost ~]#
实例9:列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字
命令:ss -o state fin-wait-1 ‘( sport = :http or sport = :https )’ dst 193.233.7/24
实例10:用TCP 状态过滤Sockets:
命令:
代码如下:
ss -4 state FILTER-NAME-HERE
ss -6 state FILTER-NAME-HERE
输出:
代码如下:
[root@localhost ~]#ss -4 state closing
Recv-Q Send-Q Local Address:Port Peer Address:Port
1 11094 75.126.153.214:http 192.168.10.42:4669
说明:
FILTER-NAME-HERE 可以代表以下任何一个:
代码如下:
established
syn-sent
syn-recv
fin-wait-1
fin-wait-2
time-wait
closed
close-wait
last-ack
listen
closing
all : 所有以上状态
connected : 除了listen and closed的所有状态
synchronized :所有已连接的状态除了syn-sent
bucket : 显示状态为maintained as minisockets,如:time-wait和syn-recv.
big : 和bucket相反。
实例11:匹配远程地址和端口号
命令:
代码如下:
ss dst ADDRESS_PATTERN
ss dst 192.168.1.5
ss dst 192.168.119.113:http
ss dst 192.168.119.113:smtp
ss dst 192.168.119.113:443
输出:
代码如下:
[root@localhost ~]# ss dst 192.168.119.113
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.119.103:16014 192.168.119.113:20229
ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61056
ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61623
ESTAB 0 0 192.168.119.103:16014 192.168.119.113:60924
ESTAB 0 0 192.168.119.103:16050 192.168.119.113:43701
ESTAB 0 0 192.168.119.103:16073 192.168.119.113:32930
ESTAB 0 0 192.168.119.103:16073 192.168.119.113:49318
ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844
[root@localhost ~]# ss dst 192.168.119.113:http
State Recv-Q Send-Q Local Address:Port Peer Address:Port
[root@localhost ~]# ss dst 192.168.119.113:3844
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844
[root@localhost ~]#
实例12:匹配本地地址和端口号
命令:
代码如下:
ss src ADDRESS_PATTERN
ss src 192.168.119.103
ss src 192.168.119.103:http
ss src 192.168.119.103:80
ss src 192.168.119.103:smtp
ss src 192.168.119.103:25
输出:
代码如下:
[root@localhost ~]# ss src 192.168.119.103:16021
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63054
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:62894
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63055
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:2274
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44784
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:7233
ESTAB 0 0 192.168.119.103:16021 192.168.119.103:58660
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44822
ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56737
ESTAB 0 0 192.168.119.103:16021 10.2.1.206:57487
ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56736
ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64652
ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56586
ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64653
ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56587
[root@localhost ~]#
实例13:将本地或者远程端口和一个数比较
命令:
代码如下:
ss dport OP PORT
ss sport OP PORT
输出:
代码如下:
[root@localhost ~]# ss sport = :http
[root@localhost ~]# ss dport = :http
[root@localhost ~]# ss dport \》 :1024
[root@localhost ~]# ss sport \》 :1024
[root@localhost ~]# ss sport \《 :32000
[root@localhost ~]# ss sport eq :22
[root@localhost ~]# ss dport != :22
[root@localhost ~]# ss state connected sport = :http
[root@localhost ~]# ss \( sport = :http or sport = :https \)
[root@localhost ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24
说明:
ss dport OP PORT 远程端口和一个数比较;ss sport OP PORT 本地端口和一个数比较。
OP 可以代表以下任意一个:
《= or le : 小于或等于端口号
》= or ge : 大于或等于端口号
== or eq : 等于端口号
!= or ne : 不等于端口号
《 or gt : 小于端口号
》 or lt : 大于端口号
实例14:ss 和 netstat 效率对比
命令:
代码如下:
time netstat -at
time ss
输出:
代码如下:
[root@localhost ~]# time ss
real 0m0.739s
user 0m0.019s
sys 0m0.013s
[root@localhost ~]#
[root@localhost ~]# time netstat -at
real 2m45.907s
user 0m0.063s
sys 0m0.067s
[root@localhost ~]#
说明:
用time 命令分别获取通过netstat和ss命令获取程序和概要占用资源所使用的时间。在服务器连接数比较多的时候,netstat的效率完全没法和ss比。

F. p2v迁移Linux主机报错,出现了常规系统错误:由于目标主机积极拒绝,无

问题是服务器未启动Subversion服务,或改变端口所致。多数因为安装的时候选用了端口,加上端口即可(80、8080、43等)。Windows下通过任务管理器查看svnserve.exe进程是否运行,如有则记录 PID,然后在命令行中运行netstat -ano,查看对应PID的端口号(Subversion服务的默认端口号为3690)。如是端口改变,则需要在SVN检出URL中增加端口号。增加并运行Subversion服务。

G. windows svn 客户端连不上linux svn server

能ping通只说兄明明网络通了,并不说明你的SVN服务启动了。

从你截图看,至少url就不对,url最后肯定要指向你新建的版本库,也就是说末尾肯定不会是3690,3690是你指定的端口号。你前面已经用httpd了,那肯定是用http协议了,怎么还用御哗在svn协羡拆告议?如果改成http协议,那3690前面也应该是冒号而不是/号。

如果是刚接触SVN,建议你用Collabnet SVN Edge来架设SVN服务器吧,安装配置比较省心,可以省去很多麻烦

H. windows下svn迁移到linux

将windows上svn迁移到linux上

实现svn方式和http方式访问

进入conf目录

authz :负责test3库的账号权限管理,控制账号是否读写权限
passwd :负责test3库的账号和密码管理,注意密码是明文的
svnserve.conf :svn服务器配置文件
示例:

启动:

端口:3690 注意打开防火墙
访问:
svn://192.168.1.206:3690/test3

用mod_dav_svn模块实现Apache服务进行访问svn仓库,mod_dav_svn是Apache和svn之间的接口

SVNParentPath /svn/svndir
指如果有多个版本库建议使用SVNParentPath不使用SVNPath,/svn/svndir 版本库位置
AuthUserFile /svn/svndir/passwd
指后面使用apache的htpasswd创建的用户名密扒樱码
AuthzSVNAccessFile /svn/svndir/authz
指权限文件

创建用户并设置密码

此时可以通过
http://192.168.1.206/svn/test3
在浏览器中输入用户名密码访问

直接将windows下Repositories目录下的数据打包迁移到linux下的Repositories即可访问,但是用户名和密码不可以迁移,需要重建

1 注意权限为问题,如果/svn/svndir属主不是apache,会一直访问拒绝访问
2 svn协助与http协议
svn协议,用于客户端使用svn://方式访问版本库,而mod_authz_svn模块让客户端可通过Apache访问版本库,它们分别使用不同的服务:svnserve、httpd进行访问。由于用户、组权限不同,权限管理方式也不相同,因此没此游,不建议同时启动两种访问方式。
而易用性,管理方便的角度来分析,Apache以,mod_authz_svn模块的方式访问版本库会更多人选择。(mod_authz_svn方式,使用80端口访问,并且提供https等加密传输,用于用户信息验证的密码枯销保存方式不是明文的)

I. 如何在windows上安装部署设置SVN服务器

一、准备工作
1、SVN服务器:解压缩包,可以从官方网站下载最新版本。
2、SVN客户端:TortoiseSVN,即常说的小乌龟,是一个客户端程序,用来与服务器端通讯。
二、安装服务器和客户端程序
1、SVN服务器:直接解压缩到某个文件夹下即可。示例路径:c:\svn\
备注:如果下载的是msi程序,直接运行按提示安装即可。
2、SVN客户端:直接运行按提示安装即可。示例路径:C:\Program
Files\Subversion
三、建立版本库(Repository):示例路径:e:\svnroot。建立版本库有两种方法:
方法一,建立空目录e:\svnroot\repos1,进入repos1文件夹,在空白处点击右键,选择“TortoiseSVN->Create
Repositoryhere...”,
方法二,建立空目录e:\svnroot\repos2,进入DOS命令行,输入如下命令:
svnadmincreate
e:\svnroot\repos2
四、运行SVN服务器,启动服务。启动服务有两种方法:
方法一,临时启动服务,在DOS下输入如下命令:
svnserve
-d
-r
e:\svnroot\repos1
--listen-host
ip地址
--listen-port=端口号
说明:“listen-host”和“listen-port”可选。默认端口是3690,如果端口已经被占用,可以通过选项listen-port指定端口号。
注意:请不要关闭命令行窗口,关闭窗口会把
svn服务就停止了。
方法二,启动SVN服务为后台运行程序:
sc
create
svnserve
binPath=
"c:\svn\bin\svnserve.exe
--service
-r
e:\svnroot\repos1"
displayname=
"Subversion"
depend=Tcpip
start=
auto
说明一:
(1)sc是windows自带的服务配置程序。svnserve是服务的名称,可根据需求取名。
(2)参数binPath表示svnserve可执行文件的安装路径。
(3)--service表示以windows服务的形式运行,--r指明svnrepository的位置,service参数与r参数都作为binPath的一部分,因此与svnserve.exe的路径一起被包含在一对双引号当中。
(4)displayname表示在windows服务列表中显示的名字,depend=Tcpip表示svnserve服务的运行需要tcpip服务,start=auto表示开机后自动运行。安装服务后,svnserve要等下次开机时才会自动运行。
说明二:
(1)binPath的等号前面无空格,等号后面有空格。displayname、depend、start也一样,service前面是--,不是-
,而r前面是-。
(2)若要卸载svn服务,则执行
sc
delete
svnserve
即可。
(3)从“sc”到“auto”是在同一个命令sc,必须写在同一行。
(4)启动服务命令:netstart
svnserve,停止服务命令:net
start
svnserve,也可以进入Windows提供的界面操作SVNService服务了,即控制面板—>服务。
(5)如果路径中包括空格,一定要用“\”处理“"”号,例如上面的例子中如果svnserve.exe在“c:\programfiles\svn\”中,则命令应该写为“binpath="\"c:\programfiles\svn\bin\svnserve.exe\"
五、配置用户和权限
(1)修改svnserve.conf,在e:\svn\repos1\conf目录下,用文本编辑器打开svnserve.conf:
将:
#
anon-access
=
read
#
auth-access
=
write
#
password-db
=
passwd
改为
anon-access
=
read
auth-access
=
write
password-db
=
passwd
注意说明:
anon-access等列前面是没有空格的。
anon-access
=
read表示没通过用户名密码登录的访问只有读的权限,如果改为none则没有用户名密码不能访问
auth-access
=
write表示通过用户名密码登录的有写的权限(当然读的权限也就有了)
password-db
=
passwd表示可以通过
用户名
=
密码
的方式在passwd文件中添加用户
(2)修改同目录的passwd文件,增加用户帐号:
将:
[users]
#
harry
=
harryssecret
#
sally
=
sallyssecret
添加帐号:
[users]
#
harry
=
harryssecret
#
sally
=
sallyssecret
admin
=
admin
添加一个admin账户,密码是admin。
6
六、初始化SVN,导入数据
选中要上传SVN的文件夹,“右键
->TortoiseSVN
->
Import...”
,在弹出对话框的“URL
of
repository”输入“svn://localhost/project1/”。在“Importmessage”输入注释,点击OK,要求输入帐号,输入账户admin和密码admin。
7
七,测试SVN
本地测试:新建一空文件夹test1,单击右键,选择“SVN
Checkout”,在“URL
of
repository”中输入“svn://localhost/project1”。
其他机器测试:如果运行svnserve的主机IP地址是1.2.3.4,则URL输入的内容就是“svn://1.2.3.4/project1”。

J. 在linux下 查看端口是否打开 ,输入netstat -an | grep 3690 后什么都没显示 是代表什么意识 没打开吗

什么都没显示的话那就代表3690端口未打开。
我个人netstat后面加的习惯参数是:anptlu
eg:netstat -anptlu | grep 端口号
补充如下:
netstat [选项]

命令中各选项的含义如下:

-a 显示所有socket,包括正在监听的。
-c 每隔1秒就重新显示一遍,直到用谨山户中断它。
-i 显示所有网络接口的信息,格式同“ifconfig -e”。
-n 以网络IP地址代替名称,显示出网络连接情形。
-r 显示携或核心路由表,格式同“route -e”。
-t 显示TCP协议的连接情况。
-u 显示UDP协议的连接情况。
-v 显示正在进行的工作。

-A 显示任何关联的协议控制块的地址。主要用于调试
-a 显示所有套接字的状态。在一般情况下不显示与服务器进程相关联的套接字
-i 显示自动配置接口的状态。那些在系统初始引导后配置的接口状态不在输出之列
-m 打印网络存储器的使用情况
-n 打印实际地址,而不是对地址的解释或者显示主机辩晌伍,网络名之类的符号
-r 打印路由选择表
-f address -family对于给出名字的地址簇打印统计数字和控制块信息。到目前为止,唯一支持的地址簇是inet
-I interface 只打印给出名字的接口状态
-p protocol-name 只打印给出名字的协议的统计数字和协议控制块信息
-s 打印每个协议的统计数字
-t 在输出显示中用时间信息代替队列长度信息。

阅读全文

与linux3690相关的资料

热点内容
amdlinux显卡安装 浏览:564
泰海科技云服务器如何卸载 浏览:122
有密码打开excel加密 浏览:818
java生成重复字符 浏览:280
串口服务器有什么用 浏览:328
linux安装red5 浏览:295
单片机中断时入口地址作用 浏览:148
程序员的工作是重复性的吗 浏览:67
照片怎么转换成pdf 浏览:133
女生学编程好吗 浏览:240
目前绝地求生怎么看服务器地址大全 浏览:825
论人类不平等的起源pdf 浏览:436
压缩机螺杆加工 浏览:370
怎么把网站服务器设置在境外 浏览:164
单片机编程取反 浏览:897
51单片机课程设计课题 浏览:900
手机淘宝登录怎么加密码 浏览:486
linux快捷方式图标 浏览:38
阳光车险的app叫什么名字 浏览:462
购买单片机的器件时需要给商家啥 浏览:535