Heloowird

使用Shell 脚本管理Python 内置的HTTPServer 服务

前言

在日常工作中,需要向其他人展示静态页面、或分享文件。使用Apache作为web服务器来展示、共享这些静态页面或者文件会存在一些不便:一般会在多台Linux机器上同时工作,需搭建多个Apache,需花费一定的时间;同时会有多个文件或者Demo存在不同的工作目录下,如果使用Apache,需要拷贝到指定目录下(或者配置目录为web根目录),不够方便、快捷。

Linux上内置Python,而Python自带一个SimpleHTTPServer类,只需要运行下面的一行代码便可启动一个web服务器:

1
$ python -m SimpleHTTPServer [port]

在浏览器上输入http://[机器名]:[port],便可以访问到该目录下的所有文件。运行该命令的目录为web服务器的根目录,只需要保证对外共享的静态页面、或文件放在该目录下,其他人就可以通过HTTP方式访问。如果不指定port,会默认使用8000。所以,在不同工作目录下,只需以不同的端口启动HTTPServer即可。

问题

当一台机器上启动多个SimpleHTTTPServer时,会碰到若干问题:忘记哪些端口已经使用过,或者忘记哪个目录已经处于共享状态,同时对一些很久以前启动的HTTP服务需要停掉以减轻机器负荷等。因此,本文旨在介绍如何使用Shell脚本来管理一台机器上多个HTTPServer。

根据上述罗列的问题,分别对应三个功能:

  • 启动web服务,判断端口是否占用
  • 列出正在使用web服务信息,包括进程号、端口号、根目录
  • 停止指定web服务或者全部web服务

方案

首先启动web服务比较简单,直接使用上述命令,在末尾加上&以保持web服务后台运行。在此之前,需要判断指定端口是否占用。使用netstat获得端口使用信息,然后使用grep进行查询指定端口是否已经在使用。

其次列出web服务的各项信息,方便找出哪些端口占用、哪些目录已经共享,同时列出进程号,为停止某个web服务做准备。这里使用ps命令,找出所有名字中含有“SimpleHTTPServer”的进程。在Linux中,一切皆以文件的形式进行管理,进程也不例外,只需要使用ls -l /proc/[id]就可以找出启动该进程的目录,也就是web服务的根目录。

最后是停掉web服务。根据上文所描述的列出web服务信息,可以轻易某个web服务找到对应进程id,然后通过kill [id]即可关闭对应的web服务。关闭所有的web服务,只是重复上述过程即可,直到没有可以kill掉的进程为止。

代码结构主要包括3个脚本:启动web服务对应start_http.sh,显示web服务对应list_http.sh,停止web服务对应stop_http.sh。为了方便,可以使用alias设置别名。在.bashrc或者.bash_profile文件中里面添如下面配置,然后source修过后的文件生效。

1
2
3
alias start_http='sh [the_absolute_path_of_your_shell_dir]/start_http.sh'
alias list_http='sh [the_absolute_path_of_your_shell_dir]/list_http.sh'
alias stop_http='sh [the_absolute_path_of_your_shell_dir]/stop_http.sh'

后语

我在工作中使用这套脚本来管理Linux机器上的多个web服务,用起来很省心、顺手,特此分享出来。详细代码在github,欢迎试用。