用newlisp管理windows下的nginx

我写了一个nginx.lsp文件,可以通过传递参数来进行Nginx进程管理。

使用方法

1. 从nginx站点下载windows版本的程序,加压后,将newlisp.lsp文件复制到该目录。

2. 确保windows的system32目录下有newlisp.exe程序。

3. 运行程序, 目前支持5个参数

newlisp nginx.lsp start|stop|monitor|reload|view

比如下面用view来观察进程:

c:\newlisp nginx.lsp view

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
nginx.exe                     8048 Console                    1      6,716 K
nginx.exe                     4512 Console                    1      6,988 K
nginx.exe                     1684 Console                    1      6,836 K
nginx.exe                     4652 Console                    1      7,132 K
nginx.exe                     6512 Console                    1      6,816 K
nginx.exe                     6868 Console                    1      7,152 K

可以用stop参数关闭所有nginx进程。

具体实现代码如下:

;; parse argument as one of the following
;; start|stop|reload|monitor|view

(define (log-ok msg)
  (append-file "nginx_process_ok.log" (append "\n" (string (now 480)) " "))
  (append-file "nginx_process_ok.log" (append ": " msg))
  )

(define (log-err msg)
  (append-file "nginx_process_err.log" (append "\n" (string (now 480)) "  "))
  (append-file "nginx_process_err.log" (append ": " msg))
  )

(define (start)
  (process "start.bat")
  )

(define (kill-process e)
  (if (regex "^nginx.exe" e)
      (begin
	(set 'pid ((regex "^nginx.exe[ ]+([0123456789]+)" e) 3))
	(exec (append "Taskkill /PID " pid " /F")))))

(define (handle-element e)
  (if (regex "^nginx.exe" e)
      (set 'h true)))

(define (check-nginx-process)
  (set 'cmd "tasklist /fi \"imagename eq nginx.exe\"")
  (set 'result (exec cmd))
  (set 'h nil)
  (dolist (str result)
	  (handle-element str))
  )

(define (kill-nginx-processes)
  (set 'cmd "tasklist /fi \"imagename eq nginx.exe\"")
  (set 'result (exec cmd))
  (set 'h nil)
  (dolist (str result)
	  (kill-process str))
  )

(define (view)
  (set 'cmd "tasklist /fi \"imagename eq nginx.exe\"")
  (set 'result (exec cmd))
  (dolist (str result)
	  (println str))
  )

(define (stop)
  (set 'cmd "tasklist /fi \"imagename eq nginx.exe\"")
  (set 'result (exec cmd))
  
  (check-nginx-process)
  (if h
      (begin
	(println "stoping nginx now ...")
	(exec "nginx -s stop")
	(sleep 1000)
	(check-nginx-process)
	(if h
	    (begin
	      (println "kill nginx processes ...")
	      (kill-nginx-processes)
	      )))
      (println "do nothing because nginx is stopped"))
  )

(define (reload)
  (exec "nginx -s reload")
  )

(define (monitor)
  (while true
	 (begin
	   (sleep 10000)
	   (println "check nginx process at 10 seconds")
	   (check-nginx-process)
	   ( h
		   (begin
		     (log-err "nginx is stopped, start it now ...")
		     (start))
		   (log-ok "nginx process is alive")
		   )
	   )
	 )
  )

(define (main-fun)
  (set 'action ((main-args) 2))
  (unless action
	  (begin
	    (println "please pass one of the arguments: start|stop|reload|monitor|view")
	    (exit)))
  (if (= "start" action)
     (start))

  (if (= "stop" action)
     (stop))

  (if (= "reload" action)
     (reload))

  (if (= "monitor" action)
     (monitor))

  (if (= "view" action)
      (view))
  )

(main-fun)
(exit)





你可能感兴趣的:(用newlisp管理windows下的nginx)