Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/smc_sagews/smc_sagews/sage_server_command_line.py
Views: 286
1
# A very simple interface exposed from setup.py
2
from __future__ import absolute_import
3
import os, socket, sys
4
import time
5
6
7
def log(s):
8
sys.stderr.write('sage_server: %s\n' % s)
9
sys.stderr.flush()
10
11
12
def main(action='', daemon=True):
13
SMC = os.environ['SMC']
14
PATH = os.path.join(SMC, 'sage_server')
15
if not os.path.exists(PATH):
16
os.makedirs(PATH)
17
file = os.path.join(PATH, 'sage_server.')
18
19
pidfile = file + 'pid'
20
portfile = file + 'port'
21
logfile = file + 'log'
22
23
if action == '':
24
if len(sys.argv) <= 1:
25
action = ''
26
else:
27
action = sys.argv[1]
28
29
def start():
30
log("starting...")
31
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
32
s.bind(('', 0)) # pick a free port
33
port = s.getsockname()[1]
34
del s
35
log("port=%s" % port)
36
open(portfile, 'w').write(str(port))
37
open(logfile, 'w') # for now we clear it on restart...
38
log("setting logfile to %s" % logfile)
39
40
t0 = time.time()
41
from . import sage_server
42
log("seconds to import sage_server: %s" % (time.time() - t0))
43
run_server = lambda: sage_server.run_server(port=port, host='127.0.0.1', pidfile=pidfile, logfile=logfile)
44
if daemon:
45
log("daemonizing")
46
from .daemon import daemonize
47
daemonize(pidfile)
48
run_server()
49
else:
50
log("starting in foreground")
51
run_server()
52
53
def stop():
54
log("stopping...")
55
if os.path.exists(pidfile):
56
try:
57
pid = int(open(pidfile).read())
58
sid = os.getsid(pid)
59
log("killing sid %s" % sid)
60
os.killpg(sid, 9)
61
log("successfully killed")
62
except Exception as e:
63
log("failed -- %s" % e)
64
log("removing '%s'" % pidfile)
65
os.unlink(pidfile)
66
else:
67
log("no pidfile")
68
69
def usage():
70
print(("Usage: %s [start|stop|restart]" % sys.argv[0]))
71
72
if action == 'start':
73
start()
74
elif action == 'stop':
75
stop()
76
elif action == 'restart':
77
try:
78
stop()
79
except:
80
pass
81
start()
82
else:
83
usage()
84
85