1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Signal handling is OS-specific because there is no SIGKILL on Windows.
import os
if os.name == "nt":
# Attempting to import SIGKILL on Windows would cause script to fail.
from signal import SIGTERM
else:
from signal import SIGTERM, SIGKILL
import sys
import traceback
import time
import atlas_config as mc
def main():
atlas_home = mc.atlasDir()
confdir = mc.dirMustExist(mc.confDir(atlas_home))
mc.executeEnvSh(confdir)
mc.dirMustExist(mc.logDir(atlas_home))
atlas_pid_file = mc.pidFile(atlas_home)
try:
pf = file(atlas_pid_file, 'r')
pid = int(pf.read().strip())
pf.close()
except:
pid = None
if not pid:
sys.stderr.write("No process ID file found. Server not running?\n")
return
if not mc.exist_pid(pid):
sys.stderr.write("Server no longer running with pid %s\nImproper shutdown?\npid file deleted.\n" %pid)
os.remove(atlas_pid_file)
return
os.kill(pid, SIGTERM)
mc.wait_for_shutdown(pid, "stopping atlas", 30)
if not mc.exist_pid(pid):
print "Apache Atlas Server stopped!!!\n"
# assuming kill worked since process check on windows is more involved...
if os.path.exists(atlas_pid_file):
os.remove(atlas_pid_file)
# stop solr
if mc.is_solr_local(confdir):
mc.run_solr(mc.solrBinDir(atlas_home), "stop", None, mc.solrPort(), None, True)
if mc.is_cassandra_local(confdir):
mc.run_zookeeper(mc.zookeeperBinDir(atlas_home), "stop")
# stop elasticsearch
if mc.is_elasticsearch_local():
logdir = os.path.join(atlas_home, 'logs')
elastic_pid_file = os.path.join(logdir, 'elasticsearch.pid')
try:
pf = file(elastic_pid_file, 'r')
pid = int(pf.read().strip())
pf.close()
except:
pid = None
if not pid:
sys.stderr.write("No process ID file found. Elasticsearch not running?\n")
return
if not mc.exist_pid(pid):
sys.stderr.write("Elasticsearch no longer running with pid %s\nImproper shutdown?\npid file deleted.\n" %pid)
os.remove(elastic_pid_file)
return
os.kill(pid, SIGTERM)
mc.wait_for_shutdown(pid, "stopping elasticsearch", 30)
if not mc.exist_pid(pid):
print "Elasticsearch stopped!!!\n"
# assuming kill worked since process check on windows is more involved...
if os.path.exists(elastic_pid_file):
os.remove(elastic_pid_file)
# stop hbase
if mc.is_hbase_local(confdir):
mc.run_hbase_action(mc.hbaseBinDir(atlas_home), "stop", None, None, True)
if mc.exist_pid(pid):
#after 30 seconds kill it
time.sleep(30)
try:
if os.name == "nt":
# If running on Windows then timeout termination uses SIGTERM instead of SIGKILL.
sys.stderr.write("did not stop gracefully after 30 seconds: killing process using SIGTERM\n")
os.kill(pid, SIGTERM)
else:
sys.stderr.write("did not stop gracefully after 30 seconds: killing process using SIGKILL\n")
os.kill(pid, SIGKILL)
except:
pass
if __name__ == '__main__':
try:
returncode = main()
except Exception as e:
print "Exception: %s " % str(e)
print traceback.format_exc()
returncode = -1
sys.exit(returncode)