Skip to content

Commit 42fcc27

Browse files
Merge pull request #256 from igormp/kill-server
Add killServer() function
2 parents 2cfe0de + 2891ca6 commit 42fcc27

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ These are read once, when tika/tika.py is initially loaded and used throughout a
4747
10. `TIKA_STARTUP_SLEEP` - number of seconds (`float`) to wait per check if Tika server is launched at runtime
4848
11. `TIKA_STARTUP_MAX_RETRY` - number of checks (`int`) to attempt for Tika server startup if launched at runtime
4949
12. `TIKA_JAVA_ARGS` - set java runtime arguments, e.g, `-Xmx4g`
50+
5051
Testing it out
5152
==============
5253

tika/tests/test_tika.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import os
2020
import unittest
2121
import tika.parser
22+
import tika.tika
2223

2324

2425
class CreateTest(unittest.TestCase):
@@ -54,6 +55,12 @@ def test_local_path(self):
5455
file = os.path.join(os.path.dirname(__file__), 'files', 'rwservlet.pdf')
5556
self.assertTrue(tika.parser.from_file(file))
5657

58+
def test_kill_server(self):
59+
"""parse some file then kills server"""
60+
file = os.path.join(os.path.dirname(__file__), 'files', 'rwservlet.pdf')
61+
with open(file, 'rb') as file_obj:
62+
tika.parser.from_file(file_obj)
63+
self.assertIsNone(tika.tika.killServer())
5764

5865
if __name__ == '__main__':
5966
unittest.main()

tika/tika.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ def make_content_disposition_header(fn):
140140
from subprocess import Popen
141141
from subprocess import STDOUT
142142
from os import walk
143+
import signal
143144
import logging
144145
import io
145146

@@ -188,6 +189,9 @@ def make_content_disposition_header(fn):
188189
EncodeUtf8 = 0
189190
csvOutput = 0
190191

192+
# will be used later on to kill the process and free up ram
193+
TikaServerProcess = False
194+
191195
class TikaException(Exception):
192196
pass
193197

@@ -660,7 +664,8 @@ def startServer(tikaServerJar, java_path = TikaJava, java_args = TikaJavaArgs, s
660664
return False
661665

662666
# Run java with jar args
663-
cmd = Popen(cmd_string, stdout=logFile, stderr=STDOUT, shell=True)
667+
global TikaServerProcess
668+
TikaServerProcess = Popen(cmd_string, stdout=logFile, stderr=STDOUT, shell=True, preexec_fn=os.setsid)
664669

665670
# Check logs and retry as configured
666671
try_count = 0
@@ -681,6 +686,16 @@ def startServer(tikaServerJar, java_path = TikaJava, java_args = TikaJavaArgs, s
681686
else:
682687
return True
683688

689+
def killServer():
690+
'''
691+
Kills the tika server started by the current execution instance
692+
'''
693+
if(TikaServerProcess):
694+
os.killpg(os.getpgid(TikaServerProcess.pid), signal.SIGTERM)
695+
time.sleep(1)
696+
else:
697+
log.error("Server not running, or was already running before")
698+
684699
def toFilename(url):
685700
'''
686701
gets url and returns filename

0 commit comments

Comments
 (0)