diff --git a/mutalyzer/entrypoints/admin.py b/mutalyzer/entrypoints/admin.py
index b0d26f357b5e8bb8a5266628420fc6efce6407d3..77a4e948d9cec2d87a6187f2ff7ec81a710de04d 100644
--- a/mutalyzer/entrypoints/admin.py
+++ b/mutalyzer/entrypoints/admin.py
@@ -25,6 +25,7 @@ from ..db.models import Assembly, BatchJob, BatchQueueItem, Chromosome
 from .. import mapping
 from .. import output
 from .. import sync
+from .. import util
 
 
 class UserError(Exception):
@@ -95,6 +96,10 @@ def import_mapview(assembly_name_or_alias, mapview_file, encoding,
     """
     Import transcript mappings from an NCBI mapview file.
     """
+    # For long-running processes it can be convenient to have a short and
+    # human-readable process name.
+    util.set_process_name('mutalyzer: mapview-import')
+
     mapview_file = codecs.getreader(encoding)(mapview_file)
 
     try:
@@ -144,6 +149,10 @@ def sync_cache(wsdl_url, url_template, history=7):
         25 5 * * *  mutalyzer-cache-sync 'http://dom1/?wsdl' 'http://dom1/{file}' -H 7
         55 5 * * *  mutalyzer-cache-sync 'http://dom2/?wsdl' 'http://dom2/{file}' -H 7
     """
+    # For long-running processes it can be convenient to have a short and
+    # human-readable process name.
+    util.set_process_name('mutalyzer: cache-sync')
+
     cache_sync = sync.CacheSync(output.Output(__file__))
     inserted, downloaded = cache_sync.sync_with_remote(wsdl_url, url_template,
                                                        history)
diff --git a/mutalyzer/entrypoints/batch_processor.py b/mutalyzer/entrypoints/batch_processor.py
index ae3c2945748db1a3b286690e8df52dedbe603c13..64fe6e7e4a26050a31c75dbbce760832ebafb4e2 100644
--- a/mutalyzer/entrypoints/batch_processor.py
+++ b/mutalyzer/entrypoints/batch_processor.py
@@ -15,12 +15,17 @@ import time
 
 from .. import db
 from .. import Scheduler
+from .. import util
 
 
 def process():
     """
     Run forever in a loop processing scheduled batch jobs.
     """
+    # For long-running processes it can be convenient to have a short and
+    # human-readable process name.
+    util.set_process_name('mutalyzer: batch-processor')
+
     scheduler = Scheduler.Scheduler()
 
     def handle_exit(signum, stack_frame):
diff --git a/mutalyzer/util.py b/mutalyzer/util.py
index c53d913054f17576e7bcdc40d1a0fc1ed57cda0e..c5810a9fe128c16ef52554435e02fa8fffc0a319 100644
--- a/mutalyzer/util.py
+++ b/mutalyzer/util.py
@@ -955,3 +955,16 @@ class LazyObject(object):
 
     __len__ = _new_method_proxy(len)
     __contains__ = _new_method_proxy(operator.contains)
+
+
+# We try to minimize non-trivial dependencies for non-critical features. The
+# setproctitle package is implemented as a C extension and hence requires a C
+# compiler and the Python development headers. Here we use it as an optional
+# dependency.
+try:
+    import setproctitle as _setproctitle
+    def set_process_name(name):
+        _setproctitle.setproctitle(name)
+except ImportError:
+    def set_process_name(name):
+        pass