What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
The reliable fix is to launch the exact Chrome binary as the same regular Unix user that runs Selenium, then align ChromeDriver’s major version, use an isolated writable profile, and start in headless mode. Do not begin by adding --no-sandbox or installing Xvfb. Those flags can hide the underlying permission or display problem. Follow the checks below in order so the error message becomes a specific, testable failure instead of guesswork.
What the error usually means
“Chrome failed to start,” “DevToolsActivePort file doesn’t exist,” and an immediate ChromeDriver exit all mean that the driver could not keep a Chrome process running long enough to establish its debugging connection. On a VPS, the usual causes are:
- Chrome is being started as
rootor another account that cannot use Chrome’s sandbox safely. - The Chrome binary selected by ChromeDriver is missing, not executable, or cannot start with the server’s libraries and permissions.
- Chrome and ChromeDriver have different major versions.
- The driver executable is not discoverable, or Selenium is selecting a different driver than expected.
- The profile directory is shared, unwritable, or locked by another process.
- A non-headless session is being started without a display server.
ChromeDriver’s diagnostic sequence is important: identify the binary from the driver log, run that binary directly as the Selenium service user, and repair Chrome before debugging WebDriver code. If the direct launch fails, Selenium cannot fix it.
1. Capture the complete ChromeDriver log
Make driver discovery and logging explicit while diagnosing. This Python baseline writes the driver log to a file and uses a profile that the service account can write.
#1 Best Overall
- [INTEL POWERED CONTENT] - Built with a 8th Generation Hexa-Core Intel i5 and 32GB of DDR4 RAM; Modern, Windows 11 ready, with 4K support, Executive multitasking, media streaming and smooth, multi-tab web browsing; Perfect as an all-purpose multimedia computer; built for content creators; Plenty of RAM and Mass storage for photo and video editing powered by Intel HD 630
- [LATEST WIRELESS TECH] - This Dell Desktop Computer easily connects to the internet through the Built In WiFi / Bluetooth
- [SOLID STATE STORAGE] - This Dell Computer setup comes with an ultra-fast 1TB Solid State Drive (SSD); Setup as the primary boot device; Boot and load programs with lightning speed ; Additional expansion available
- [BUY & OWN WITH CONFIDENCE] - From the world's largest Microsoft Authorized Refurbisher; Quality Guarantee and Free Tech Support; Award-winning Customer Service; | Support Sustainable Business
- [MODERN HI-SPEED PORTS] - USB 3.0 (x4) | USB 2.0 (x4) | DisplayPort (x1) | HDMI Port (x1) | Audio Combo Jack (x1) | Audio Out (x1) | RJ-45 Ethernet (x1) | Internal SATA (x3)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
options = Options()
options.add_argument("--headless=new")
options.add_argument("--user-data-dir=/tmp/selenium-chrome-profile")
service = Service(log_output="/var/log/chromedriver.log")
driver = webdriver.Chrome(options=options, service=service)
try:
driver.get("https://example.com")
print(driver.title)
finally:
driver.quit()
Create the log location and profile with ownership suitable for the account that runs the job. For concurrent jobs, use a different profile path for every process; Chrome profiles are not safe to share.
sudo install -d -o selenium -g selenium /var/log/chromedriver
sudo install -d -o selenium -g selenium /tmp/selenium-chrome-profile
sudo -u selenium test -w /tmp/selenium-chrome-profile && echo writable
If your service cannot write under /var/log, put the log in an application-owned directory instead. Read the entire log, not only the final “session not created” line. It often states the selected binary path and the first startup failure.
2. Run the selected Chrome binary directly
Use the binary path reported in chromedriver.log. Common installations use google-chrome, google-chrome-stable, or a Chromium executable, but do not assume the name: test the path ChromeDriver actually selected.
sudo -u selenium /usr/bin/google-chrome --headless=new --no-first-run --user-data-dir=/tmp/chrome-direct-test https://example.com
Replace the path with the one in your log. A successful command should keep running long enough to open the page and then exit cleanly when interrupted. If it reports a missing shared library, an invalid executable, a crash, or a permission error, reinstall or repair Chrome and its dependencies first. Verify the file is executable:
ls -l /usr/bin/google-chrome
file /usr/bin/google-chrome
sudo -u selenium /usr/bin/google-chrome --version
Run the test as the same Unix user used by systemd, Supervisor, Docker, or your task runner. A command that works as your SSH account can still fail for the service account because HOME, permissions, and environment variables differ.
3. Stop running Chrome as root
Google’s ChromeDriver documentation identifies root execution on Linux as a common startup-crash cause. Create a dedicated unprivileged account and run the Selenium process under it. Give that account ownership of its application directory, temporary profile directories, and any download or output paths it needs.
sudo useradd --create-home --shell /usr/sbin/nologin selenium
sudo install -d -o selenium -g selenium /srv/selenium
sudo -u selenium -H python3 /srv/selenium/test.py
The --no-sandbox switch is not the normal solution. Chrome documents this workaround as unsupported and highly discouraged for the root case. Treat it only as a short diagnostic in a controlled environment; remove it and fix the account, container, and filesystem permissions before production.
Rank #2
- Model: Dell OptiPlex 7050 Small Form Factor (SFF)
- Processor: Intel Core i7-7700 3.60 GHz
- Memory: 32GB DDR4 Ram
- Storage: 1TB Solid State Drive (SSD) Fast Boot + Storage
- Operating System: Windows 11 Pro (64-bit)
4. Verify Chrome and ChromeDriver major versions
Selenium requires the Chrome and ChromeDriver major versions to match. Check both values on the VPS:
Free tools Windows power users keep installed
One-click scans. No signup required.
google-chrome --version
chromium --version
chromedriver --version
Use the command that corresponds to the installed browser. Compare the first number in each version (for example, the 124 in 124.0.x). If they differ, update the mismatched browser or driver, then recheck. Keeping both components from the same release channel makes deployments more reproducible.
Modern Selenium can use Selenium Manager to discover and manage a compatible driver. If you pin a driver yourself, put it on PATH or provide its exact path through Service so there is no ambiguity:
service = Service(executable_path="/opt/webdrivers/chromedriver", log_output="/var/log/chromedriver.log")
driver = webdriver.Chrome(options=options, service=service)
Do not leave an old chromedriver earlier on PATH while testing a newly installed copy. command -v chromedriver shows which executable the shell will find.
5. Use headless Chrome without Xvfb
A VPS automation job normally does not need a graphical desktop. Chrome’s current headless mode shares the normal Chrome code and does not require a display server. Start with:
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →options.add_argument("--headless=new")
On an older Chrome build that rejects --headless=new, use the documented --headless form supported by that version. Do not install or configure Xvfb automatically. Add Xvfb only when your application genuinely requires a display-backed, non-headless session, such as a workflow that depends on a graphical window rather than Chrome’s headless mode.
Some libraries or legacy scripts still set a display variable or expect a window manager. Remove those assumptions for a pure headless run. If you intentionally need a display-backed session, run Xvfb under the same service account and make its display available to that process; otherwise, a missing DISPLAY is expected and headless is the simpler fix.
Rank #3
- IMMERSIVE 24 INCH DISPLAY: Experience stunning clarity on a Full HD IPS screen with ultra-thin bezels, offering a 90% screen-to-body ratio that makes everything from spreadsheets to streaming come alive with vibrant colors and crisp details.
- POWERFUL INTEL PROCESSING: Tackle demanding tasks with ease thanks to the Intel processor and 16GB of high-speed memory, delivering smooth performance whether you're multitasking between applications or running productivity software.
- GENEROUS STORAGE: Store all your important files, photos, and programs with blazing-fast solid state drive technology that ensures quick boot times, rapid file access, and plenty of space for your digital life.
- ENHANCED PRIVACY AND COLLABORATION: Work confidently with the pop-up privacy camera that tucks away when not in use, plus dual microphones with noise reduction for crystal-clear video calls that keep you connected professionally.
- ECO-CONSCIOUS DESIGN: Feel good about your purchase with an EPEAT Gold registered and ENERGY STAR certified computer that combines premium performance with responsible environmental manufacturing practices.
6. Give every job a writable, isolated profile
Chrome may exit when its profile is read-only, already locked, or shared by parallel processes. Set --user-data-dir to a directory owned by the service user. Generate a unique directory for each simultaneous job:
import tempfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
profile = tempfile.mkdtemp(prefix="chrome-profile-")
options = Options()
options.add_argument("--headless=new")
options.add_argument(f"--user-data-dir={profile}")
driver = webdriver.Chrome(options=options)
Keep the profile on a local filesystem with enough free space. Clean up temporary profiles after a successful or failed run, but do not delete a profile while Chrome is still running. A fixed profile is acceptable for a single sequential worker; it is not a safe shared cache for a worker pool.
7. Make invisible startup observable
When a headless process exits before Selenium reports a useful exception, enable Chrome’s remote debugging output. Port 0 asks Chrome to choose an available port:
options.add_argument("--remote-debugging-port=0")
Alternatively, choose a controlled free port when your firewall and process supervisor require one. Capture the WebSocket URL printed by Chrome or the driver, then inspect the target through Chrome’s chrome://inspect page from an environment that can reach the debugging endpoint. This can reveal whether Chrome opened a page, stalled during startup, or exited before creating a target.
Do not expose a remote-debugging port directly to the public internet. Bind and tunnel it through your administration channel, restrict firewall access, and close it after diagnosis.
Decision guide: choose the least risky operating model
| Choice | Use it when | Main trade-off |
|---|---|---|
| Regular-user headless Chrome | Most VPS scraping, testing, and rendering jobs | Lowest operational complexity and avoids root-sandbox crashes |
Root execution with --no-sandbox |
Only a temporary diagnostic when you cannot yet change the service account | Unsupported and highly discouraged; not a production fix |
| Selenium Manager | You want Selenium to discover a compatible driver automatically | Less manual pinning; inspect logs when a managed binary is not the one expected |
| Explicit, pinned driver path | Reproducible images and tightly controlled releases | You must update the driver when Chrome’s major version changes |
| One profile per process | Parallel jobs or isolated test sessions | Uses more temporary disk space, but avoids profile locks and state leakage |
| Display-backed Chrome with Xvfb | The application truly requires a non-headless display | More services, environment variables, and failure points than headless mode |
Common failures and targeted fixes
“DevToolsActivePort file doesn’t exist”
Usually Chrome exited before creating its debugging endpoint. Run the selected binary directly as the service user, switch to --headless=new, provide a fresh writable profile, and inspect the complete driver log. Check disk space and executable permissions before trying flags.
“session not created: This version of ChromeDriver only supports Chrome version …”
The major versions do not match. Print both versions, remove stale drivers from PATH, then update the browser or driver so their majors align.
Rank #4
- This Certified Refurbished product is tested and certified to look and work like new. The refurbishing process includes functionality testing, basic cleaning, inspection, and repackaging. The product ships with all relevant accessories, a minimum 90-day warranty, and may arrive in a generic box. Only select sellers who maintain a high-performance bar may offer Certified Refurbished products on Amazon.com.
- Dell Optiplex 3050 SFF Desktop computer PC, Intel Quad Core i5-6500 up to 3.6GHz, 16GB DDR4, 256GB SSD
- Includes: USB Keyboard & Mouse, USB WiFi adapter, Microsoft office 30 days free trail.
- Port: Front: USB 3.0(2), USB 2.0(2); Rear: DP, HDMI, USB 3.0(2), USB 2.0(2), RJ-45.
- Support 4K (3840x2160) Dual display, makes it easy to connect two monitors at the same time, and you can expand working Windows, mirror content, or expand a single window across multiple monitors.
Chrome works over SSH but fails in the service
The service probably uses a different user, HOME, working directory, or environment. Run the direct binary test with sudo -u as that account and grant it ownership of the profile, logs, downloads, and temporary directories.
“Chrome binary not found” or the wrong browser starts
Read the path in the ChromeDriver log. Install the intended Chrome/Chromium package or set Selenium’s binary location explicitly:
options.binary_location = "/usr/bin/google-chrome-stable"
Then execute that exact path directly and verify its version.
Recommended Free Tools
“unknown error: cannot find Chrome binary” after an upgrade
A package may have moved or removed the executable while the driver remained installed. Use command -v, inspect the package installation, set binary_location to the real path, and rerun the direct-user test.
Chrome starts once, then fails in parallel
Shared profile locking is the common cause. Allocate a unique --user-data-dir per process and ensure each worker has its own temporary directory and sufficient disk space.
“no display” or DISPLAY errors
Use headless mode for a server job. Install Xvfb only if the application requires a display-backed session, and configure its display and permissions for the same service account.
The process is killed without a Selenium exception
Check the driver log, system journal, container events, and memory pressure. A VPS can terminate Chrome before WebDriver receives a response. Reduce concurrent browsers, free disk and memory, and retry with one isolated profile to distinguish resource exhaustion from configuration errors.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Repair Windows errors before they cause bigger problems3Fix the driver behind crashes, sound loss and screen glitchesBest Value
- Connectivity: Includes WiFi, Bluetooth, and LAN for wireless and wired connections
- Memory: Features 16GB DDR4 RAM for smooth multitasking and performance
- Storage: Combines 500GB SSD and 1TB HDD for ample storage space
- Graphics: Integrated Intel UHD Graphics 630 for crisp visuals and video playback
- Design: Sleek desktop tower with black color and slim profile for modern look
Reliability and deployment checklist
- Record the exact Chrome and ChromeDriver versions in the image or deployment log.
- Run a smoke test as the production service user after every browser update.
- Keep ChromeDriver logs for failed jobs, including the selected binary path.
- Use headless mode unless a display is a documented application requirement.
- Allocate a unique writable profile for every concurrent process.
- Protect remote-debugging ports and never publish them openly.
- Monitor free disk, memory, and process limits on the VPS.
- Remove diagnostic
--no-sandboxusage before production.
Or skip the browser setup
If your actual goal is a clean image or PDF of a web page rather than browser automation, ScreenshotNeo provides a one-request screenshot API and an MCP server for AI agents. It handles the browser environment for you:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo documentation for all options and response headers. The equivalent Python and Node.js calls are:
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
- Cookie and consent banners, newsletter popups, and chat widgets are removed before the shot.
- Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed; response headers identify the page verdict and billing result.
- An MCP server lets Claude, Cursor, and other MCP clients take screenshots with
take_screenshot, inspect pages withget_page_info, and create PDFs withcapture_pdf. - The Free plan includes 1,000 screenshots each month with no card; paid plans start at $5 for 3,000 screenshots. Every feature is available on every plan.
Create a free ScreenshotNeo account to try it without a card.
Frequently Asked Questions
Should I always add --no-sandbox on a VPS?
No. Configure a regular service user instead. Chrome documents the root workaround as unsupported and highly discouraged; use it only briefly to confirm that root permissions are the cause.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Can one Chrome profile be shared by Selenium workers?
No. Use a separate writable --user-data-dir for each concurrent process to avoid profile locks and state collisions.
When is Xvfb actually necessary?
Only when the application requires a display-backed, non-headless Chrome session. Standard headless Chrome does not need a display server.
How can I tell which Chrome executable ChromeDriver selected?
Enable ChromeDriver logging and read the complete log; it records the binary path used during startup.
The Bottom Line
Fix the environment before changing Selenium code: run the logged Chrome binary as a regular user, align browser and driver major versions, provide a unique writable profile, and use headless mode without Xvfb. Those steps resolve the common VPS startup failures while preserving a safer, reproducible deployment.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

