66import time
77import argparse
88import platform
9+ import sys
910
1011from apps import __version__
1112
2728EXIT_MSGS = []
2829
2930
31+
3032try :
3133 os .makedirs (os .path .join (BASE_DIR , "data" , "static" ))
3234 os .makedirs (os .path .join (BASE_DIR , "data" , "media" ))
@@ -54,9 +56,8 @@ def start_gunicorn():
5456 cmd = "gunicorn jumpserver.wsgi -b {}:{} -w {}" .format (HTTP_HOST , HTTP_PORT , WORKERS )
5557 if DEBUG :
5658 cmd += " --reload"
57- subprocess .call (cmd , shell = True )
58- EXIT_MSGS .append ("Gunicorn start failed" )
59- EXIT_EVENT .set ()
59+ p = subprocess .Popen (cmd , shell = True , stdout = sys .stdout , stderr = sys .stderr )
60+ return p
6061
6162
6263def start_celery ():
@@ -68,16 +69,15 @@ def start_celery():
6869 if platform .platform ().startswith ("Linux" ):
6970 cmd = """
7071 id jumpserver || useradd -s /sbin/nologin jumpserver;
71- su jumpserver -c 'celery -A common worker -l {}'
72+ su jumpserver -c 'celery -A common worker -l {}';
7273 """ .format (LOG_LEVEL .lower ())
7374 else :
7475 cmd = """
75- export C_FORCE_ROOT=1;celery -A common worker -l {}'
76+ export C_FORCE_ROOT=1;celery -A common worker -l {}
7677 """ .format (LOG_LEVEL .lower ())
7778
78- subprocess .call (cmd , shell = True )
79- EXIT_MSGS .append ("Celery start failed" )
80- EXIT_EVENT .set ()
79+ p = subprocess .Popen (cmd , shell = True , stdout = sys .stdout , stderr = sys .stderr )
80+ return p
8181
8282
8383def start_beat ():
@@ -86,40 +86,44 @@ def start_beat():
8686 os .environ .setdefault ('PYTHONOPTIMIZE' , '1' )
8787 os .environ .setdefault ('C_FORCE_ROOT' , '1' )
8888 scheduler = "django_celery_beat.schedulers:DatabaseScheduler"
89- cmd = 'celery -A common beat -l {} --scheduler {} --max-interval 5 ' .format (LOG_LEVEL , scheduler )
90- subprocess .call (cmd , shell = True )
91- EXIT_MSGS .append ("Beat start failed" )
92- EXIT_EVENT .set ()
89+ cmd = 'celery -A common beat -l {} --scheduler {} --max-interval 60 ' .format (LOG_LEVEL , scheduler )
90+ p = subprocess .Popen (cmd , shell = True , stdout = sys .stdout , stderr = sys .stderr )
91+ return p
9392
9493
9594def start_service (services ):
96- make_migrations ()
97-
9895 print (time .ctime ())
9996 print ('Jumpserver version {}, more see https://www.jumpserver.org' .format (
10097 __version__ ))
10198 print ('Quit the server with CONTROL-C.' )
10299
103- threads = []
104- if 'gunicorn' in args .services :
105- threads .append (threading .Thread (target = start_gunicorn , args = ()))
106- if 'celery' in args .services :
107- threads .append (threading .Thread (target = start_celery , args = ()))
108- if 'beat' in args .services :
109- threads .append (threading .Thread (target = start_beat , args = ()))
110- if 'all' in args .services :
111- _threads = []
112- for func in (start_gunicorn , start_celery , start_beat ):
113- t = threading .Thread (target = func , args = ())
114- _threads .append (t )
115- threads = _threads
116-
117- for t in threads :
118- t .start ()
119-
120- if EXIT_EVENT .wait ():
121- print ("\n \n " + "####" * 30 )
122- print ("\n " .join (EXIT_MSGS ))
100+ processes = {}
101+ services_all = {
102+ "gunicorn" : start_gunicorn ,
103+ "celery" : start_celery ,
104+ "beat" : start_beat
105+ }
106+
107+ if 'all' in services :
108+ for name , func in services_all .items ():
109+ processes [name ] = func ()
110+ else :
111+ for name in services :
112+ func = services_all .get (name )
113+ processes [name ] = func ()
114+
115+ stop_event = threading .Event ()
116+ while not stop_event .is_set ():
117+ for name , proc in processes .items ():
118+ if proc .poll () is not None :
119+ print ("\n \n " + "####" * 10 + " ERROR OCCUR " + "####" * 10 )
120+ print ("Start service {} [FAILED]" .format (name ))
121+ for _ , p in processes .items ():
122+ p .terminate ()
123+ stop_event .set ()
124+ print ("Exited" .format (name ))
125+ break
126+ time .sleep (5 )
123127
124128
125129if __name__ == '__main__' :
0 commit comments