diff --git a/elevation/cli.py b/elevation/cli.py
index <HASH>..<HASH> 100644
--- a/elevation/cli.py
+++ b/elevation/cli.py
@@ -34,8 +34,7 @@ def eio():
 
 @eio.command(short_help='Audits your installation for common issues.')
 def selfcheck():
-    util.selfcheck(tools=elevation.TOOLS)
-    print('Your system is ready.')
+    print(util.selfcheck(tools=elevation.TOOLS))
 
 
 product_options = util.composed(
diff --git a/elevation/util.py b/elevation/util.py
index <HASH>..<HASH> 100644
--- a/elevation/util.py
+++ b/elevation/util.py
@@ -29,11 +29,13 @@ LOCKFILE_NAME = '.folder_lock'
 
 
 def selfcheck(tools):
+    msg = []
     for tool_name, check_cli in collections.OrderedDict(tools).items():
         try:
-            subprocess.check_output(check_cli, shell=True)
+            subprocess.check_output(check_cli, shell=True, stderr=subprocess.STDOUT)
         except subprocess.CalledProcessError:
-            raise RuntimeError('%r not found in PATH.' % tool_name)
+            msg.append('%r not found or not usable.' % tool_name)
+    return '\n'.join(msg) if msg else 'Your system is ready.'
 
 
 def composed(*funcs):
Make eio selfcheck more user friendly (show message not traceback).