@@ -58,6 +58,7 @@ import Snap.Core (Snap)
5858import System.Environment
5959import System.IO
6060import System.Process
61+import System.Exit (ExitCode(..))
6162import Text.URI (URI)
6263import qualified Text.URI as URI
6364import Text.URI.Lens
@@ -170,10 +171,15 @@ logPortBindErr p e = getProcessIdForPort p >>= \case
170171
171172getProcessIdForPort :: Int -> IO (Maybe Int)
172173getProcessIdForPort port = do
173− xs <- lines <$> readProcess "ss" ["-lptn", "sport = " <> show port] mempty
174− case uncons xs of
175− Just (_, x:_) -> return $ A.maybeResult $ A.parse parseSsPid $ BSC.pack x
176− _ -> return Nothing
174+ -- First check if 'ss' is available
175+ (c, _, _) <- readProcessWithExitCode "which" ["ss"] mempty
176+ case c of
177+ ExitSuccess -> do
178+ xs <- lines <$> readProcess "ss" ["-lptn", "sport = " <> show port] mempty
179+ case uncons xs of
180+ Just (_, x:_) -> return $ A.maybeResult $ A.parse parseSsPid $ BSC.pack x
181+ _ -> return Nothing
182+ _ -> return Nothing
177183
178184parseSsPid :: A.Parser Int
179185parseSsPid = do