RE:NODE

SteamCMD errors and fixes: a reference for server admins

By RE:NODE Team
16 min read


Most SteamCMD failures come down to five causes: the login does not own the app, the disk is full, the user cannot write to the folder, the network dropped mid-download, or Steam's cached data about the app is stale. The error text names one of these, but usually in a way that points somewhere else. This page takes the messages people actually search for, says what each one means, and gives the fix in the order worth trying. It assumes you already know the basic install line. If you do not, SteamCMD explained covers app ids, anonymous login, validate, beta branches and update scripts. This post is about what to do when that line fails.

How to read a SteamCMD failure#

A failed app_update ends with one of two kinds of line, and they tell you different things.

code
ERROR! Failed to install app '896660' (Disk write failure)Error! App '896660' state is 0x202 after update job.

The first kind has a reason in brackets. That reason comes from the Steam client's own content system and is the closest thing to a diagnosis you get. The second kind only reports the state the app was left in, as a hexadecimal set of flags. It tells you the update stopped, not why it stopped. Both are covered below.

Before you start changing things, get three facts:

  1. The full output, not the last line. Scroll up. A login that quietly failed, or a warning about the install directory, is often fifty lines above the error everyone quotes.
  2. Free space and inodes on the volume you install to. df -h /srv/valheim and df -i /srv/valheim on Linux. A full inode table produces the same error as a full disk while df -h shows plenty of room.
  3. Who owns the install directory, and who is running SteamCMD. ls -ld /srv/valheim and whoami. If they differ, you have probably found the problem.

SteamCMD also keeps logs of its own under its Steam directory - on Linux usually ~/Steam/logs/, on Windows the logs folder next to steamcmd.exe. content_log.txt in that folder records each update job in more detail than the console shows, including which file failed to write. Exact paths vary with how SteamCMD was installed (a distribution package puts things in a different home than the tarball), so search for the file if it is not where you expect.

One setting changes what you see. In a script run with +runscript, @ShutdownOnFailedCommand 1 makes SteamCMD stop at the first error. Without it, a failed app_update is followed by quit, the process exits, and a wrapper that only checks the exit code reports success. If your errors are being discovered by players rather than by you, fix that first. The habit of grepping for Success! App 'X' fully installed. is explained in the main SteamCMD post, and reading the console covers the general skill of telling the cause from the noise.

Missing configuration#

code
ERROR! Failed to install app '90' (Missing configuration)

This is the most searched SteamCMD error and the least specific. It means SteamCMD could not get a usable configuration for that app - the information about which depots to download for this platform and this login. The causes, roughly from most to least common:

  • A stale app info cache. SteamCMD keeps cached metadata for every app in an appcache folder inside its own directory. When that cache disagrees with what Steam currently publishes, the install fails before it downloads anything.
  • The wrong app id. Passing a game's id where the dedicated server tool's id belongs, or a typo that lands on an unrelated app.
  • A login with no access to that configuration. The app may report this rather than No subscription when the login cannot see its configuration.
  • A platform with no depots. Some apps report a missing configuration rather than Invalid platform when there is simply no build for your operating system.
  • Something transient on Steam's side. It happens, and a retry ten minutes later works.

Work through the fixes in order:

  1. Run the same command again. Not as a superstition - a first run that refreshed the app info cache often succeeds on the second attempt.
  2. Check the app id against the server tool's id, not the game's. Valheim's server is 896660, the game is 892970, and only the first installs.
  3. Stop SteamCMD and delete its appcache folder (not steamapps, and not your install directory). The next run rebuilds it from scratch.
  4. Try a forced platform if the app only ships for another OS - see below.
  5. If it needs an owning account, log in with one.
bash
$ cd ~/steamcmd$ rm -rf appcache$ ./steamcmd.sh +force_install_dir /srv/hlds +login anonymous \    +app_update 90 validate +quit

The Half-Life Dedicated Server special case

App 90 - the old GoldSrc server used by Counter-Strike 1.6 and other Half-Life mods - is famous for this error. It has been unreliable for years, and the long-standing community workaround is to tell SteamCMD which mod you want with app_set_config and then run app_update 90 validate several times until it reports success:

bash
$ ./steamcmd.sh +force_install_dir /srv/cs16 +login anonymous \    +app_set_config 90 mod cstrike \    +app_update 90 validate +app_update 90 validate +quit

Behaviour has changed over time and differs by mod, so treat this as the thing to try rather than a guarantee. If you only need a running CS 1.6 server, a prepared install is less painful than fighting app 90 - the Counter-Strike 1.6 server guide covers what the server needs once the files are in place.

Invalid platform

code
ERROR! Failed to install app '556450' (Invalid platform)

This one is unambiguous: the app has no build for the operating system SteamCMD is running on. The Forest's dedicated server is the usual example, because it only ships a Windows binary. On Linux you can download the Windows build anyway and run it under Wine:

install-forest.txt
@ShutdownOnFailedCommand 1@sSteamCmdForcePlatformType windowsforce_install_dir /srv/theforestlogin anonymousapp_update 556450 validatequit

The setting has to come before app_update, and it applies to the rest of that run. Running a Windows server on Linux is a separate decision with its own costs; Linux vs Windows game servers lists which games need it.

No subscription#

code
ERROR! Failed to install app '223350' (No subscription)

Clearer than it looks: the logged-in identity does not hold a licence for that app. There are three ways to get there.

  • Anonymous login against an app that refuses it. DayZ (223350), Arma 3 (233780) and Project Zomboid's server are the common ones. You need a Steam account that owns the game.
  • The right account, the wrong app. An account that owns the game but is installing something it has no licence for - often the result of a mistyped id.
  • A login that did not actually happen. If the login step failed, every command after it runs as nobody, and an app that needs an owner reports No subscription. Scroll up and look for the login line ending in OK.

The fix is to log in as an account that owns the game, interactively the first time so Steam Guard can be satisfied, and then keep using that account in scripts. Use a spare account that holds nothing but the game: a server is a poor place to keep the credentials of the account you buy things with.

On RE:NODE, games that need your own Steam login - Arma 3, DayZ, Project Zomboid and 7 Days to Die among them - are created immediately and then wait on the Setup tab until you enter the credentials. They are stored as typed, which is why the advice about a spare account applies there too.

Disk write failure and Missing file permissions#

code
ERROR! Failed to install app '896660' (Disk write failure)ERROR! Failed to install app '896660' (Missing file permissions)

These are two different messages for overlapping problems, and a permissions problem can surface as either. Check these four things, in this order:

CheckCommand or placeWhat fixes it
Free spacedf -h <dir>Free 20-30% above the install size
Free inodesdf -i <dir>Delete small files, old logs
Ownershipls -ld <dir>chown -R to the SteamCMD user
Read-only mountmount, kernel logFix the filesystem, then validate

Space is the most common cause, and it is less obvious than it sounds. SteamCMD stages downloaded chunks on the same volume before committing them, so an update needs room for the changed files on top of the existing install. A disk with 2 GB free can fail a 1.5 GB update. Old Workshop content, crash dumps and rotated logs are the usual things filling it; what to do when the disk is full has a cleanup list.

Ownership is the second. The classic route is running SteamCMD once as root "to get it working", which leaves root-owned files the service user cannot replace on the next update. Fix it once:

bash
$ sudo chown -R steam:steam /srv/valheim /home/steam/steamcmd$ sudo -u steam /home/steam/steamcmd/steamcmd.sh \    +force_install_dir /srv/valheim +login anonymous \    +app_update 896660 validate +quit

Then never run it as root again. File permissions and ownership goes through the general case, including servers that write files as a different user from the one that installs them.

On Windows the usual causes are an install directory under C:\Program Files without elevated rights, a file locked because the server is still running, and antivirus quarantining a freshly written executable mid-update. Stop the server before updating, install outside Program Files, and exclude the install directory from real-time scanning if the failures always land on .exe and .dll files.

State codes: 0x202, 0x402, 0x602 and friends#

code
Error! App '740' state is 0x602 after update job.

The hexadecimal number is a set of flags describing the app's state, added together. Knowing what the bits mean turns a mystery code into a plain sentence. These are the flags you will see in these errors:

FlagMeaning
0x2Update required
0x4Fully installed
0x200Update paused
0x400Update started

Read the codes against that table:

  • `0x202` = update required plus update paused. The job stopped and the app still needs the update. In practice this is overwhelmingly a disk space problem; check df -h before anything else.
  • `0x402` = update required plus update started. The job began and did not finish. Network interruptions and timeouts are the usual cause.
  • `0x602` = required, paused and started. The update got going and then stopped. It is the generic "something went wrong mid-update" state: disk space, permissions, a dropped connection, or a process that was killed.
  • `0x6` = update required on an installed app, with no update in progress. Usually seen when a job never got as far as starting - look for a login or app info failure earlier in the output.

None of these codes contains the reason. That is why the three checks at the top of this page - space, ownership, network - are the answer to all of them, and why content_log.txt is worth opening when the obvious checks pass.

The same flags live in the app manifest as a decimal number. Open steamapps/appmanifest_<appid>.acf in the install directory and look for StateFlags. A healthy install reads "StateFlags" "4". Anything else means SteamCMD considers the install unfinished, and the next app_update with validate is the right move.

Progress lines during a download use a different set of codes, which confuses people who search for them:

code
 Update state (0x5) verifying install, progress: 12.40 (512 / 4130) Update state (0x61) downloading, progress: 45.22 (1868 / 4130) Update state (0x101) committing, progress: 98.10 (4052 / 4130)

These are phases, not errors. The word after the code is the part to read. A progress line that sits on the same number for minutes during downloading is a network or disk throughput problem; during committing or verifying on a slow disk it is often just slow, and interrupting it is how you get a 0x602.

Timeouts, connection failures and login errors#

Network problems show up in a few distinct shapes.

SteamCMD cannot update itself. On first launch, or after a long gap, the bootstrapper checks for its own update before doing anything. If it cannot reach Steam's content servers it stops there, with a message along the lines of Steam needs to be online to update. Check DNS resolution on the host, outbound HTTP and HTTPS through any firewall, and a proxy if your network requires one. A host with broken IPv6 routing but a working IPv4 path is a frequent culprit.

Login hangs or fails. The login line ends in OK or FAILED with a reason. The ones you will meet:

code
Logging in user 'spareaccount' to Steam Public...FAILED (Invalid Password)Logging in user 'spareaccount' to Steam Public...FAILED (Rate Limit Exceeded)Logging in user 'spareaccount' to Steam Public...FAILED (Two-factor code mismatch)

Invalid Password is what it says, though check for a shell eating a special character if you passed it on the command line. Rate Limit Exceeded means too many attempts in a short time; the only fix is to stop and wait, and every retry pushes the window out. Two-factor code mismatch means a Steam Guard code was wrong or expired, which also happens when the host's clock has drifted. Running one interactive login by hand, approving it, and letting SteamCMD cache the credential is how unattended runs avoid all three.

Downloads that time out. Large app updates occasionally stall, and Workshop downloads time out far more often:

code
ERROR! Timeout downloading item 463939057

Big Workshop items routinely need two or three attempts on a slow link. Retry the same item before assuming anything is wrong. If the same item fails every time, delete steamapps/workshop/appworkshop_<gameappid>.acf and the item's folder, then fetch it again. A different message, ERROR! Download item 463939057 failed (Failure)., more often means the item is private, removed, or needs an owning login. Steam Workshop mods on dedicated servers covers the Workshop side in depth.

Linux: 32-bit libraries and steamclient.so#

SteamCMD on Linux is a 32-bit program. On a fresh 64-bit system without 32-bit support, the failure is confusing because the file it complains about plainly exists:

code
steamcmd.sh: line 38: /home/steam/steamcmd/linux32/steamcmd: No such file or directory

"No such file" here refers to the 32-bit loader the binary needs, not the binary itself. The other common form names a library:

code
linux32/steamcmd: error while loading shared libraries: libstdc++.so.6:cannot open shared object file: No such file or directory

Both are fixed the same way:

bash
# Debian and Ubuntu$ sudo dpkg --add-architecture i386$ sudo apt update$ sudo apt install lib32gcc-s1      # lib32gcc1 on older releases$ sudo apt install lib32stdc++6     # if libstdc++.so.6 is still missing# RHEL, Rocky, AlmaLinux$ sudo dnf install glibc.i686 libstdc++.i686

Package names change between distribution releases, which is why guides disagree. If apt cannot find lib32gcc-s1, you are on an older release that calls it lib32gcc1.

A related problem appears after a successful install, when the game server starts rather than SteamCMD:

code
[S_API FAIL] SteamAPI_Init() failed; unable to locate a running instanceof Steam, or a local steamclient.so.

The game server is looking for steamclient.so in ~/.steam/sdk64/ (or sdk32 for a 32-bit server) and not finding it. SteamCMD ships the library in its own linux64 and linux32 folders. Linking it into place is the standard fix:

bash
$ mkdir -p ~/.steam/sdk64$ ln -sf ~/steamcmd/linux64/steamclient.so ~/.steam/sdk64/steamclient.so

Some servers instead expect the file next to their own executable, and their start scripts set LD_LIBRARY_PATH to find it. If a game's own start script does that, use it rather than launching the binary directly.

Messages you can ignore#

SteamCMD is noisy, and several lines look like errors on every run without meaning anything. Knowing them saves an evening:

  • Redirecting stderr to '.../logs/stderr.txt' - informational.
  • ILocalize::AddFile() failed to load file "public/steambootstrapper_english.txt". - printed on early runs, harmless.
  • dlmopen steamservice.so failed: steamservice.so: cannot open shared object file - SteamCMD does not need it; printed every run on Linux.
  • Unable to determine CPU Frequency. Try defining CPU_MHZ. - cosmetic, common in containers and VMs.
  • Please use force_install_dir before logon! - not ignorable in the same way. Current builds warn when force_install_dir comes after login, and the install may not go where you meant. Move it first.

The rule of thumb: if the run ends with Success! App 'X' fully installed. or Success! App 'X' already up to date., the lines above it were noise.

When validate fixes it, and when it does not#

validate re-hashes every file in the install against Steam's manifest and replaces what does not match. It fixes:

  • an install left half-written by a full disk, a killed process or a dropped connection - the 0x602 family;
  • a server that crashes at startup right after an update that "succeeded";
  • files corrupted on disk.

It does not fix:

  • anything on the list above about logins, licences, platforms or app ids - it runs after those checks pass;
  • a disk that is still full, or a directory the user still cannot write to;
  • a broken mod, plugin or config file you added, since those are not in the manifest. Use what to do when a mod update breaks instead;
  • a version mismatch with clients. That is a branch question, covered in version pinning and rollbacks.

Also remember that it reverts any file that shipped with the app, including a start script or default config you edited in place. Keep a copy.

When validate itself keeps failing on the same app, the last resort before a clean reinstall is to delete steamapps/appmanifest_<appid>.acf in the install directory and run the update again. SteamCMD then has no record of the install and re-downloads everything, keeping files that are not part of the app. Back up saves first.

On a container-based host there is one more cause to name. If a server hits its memory limit during an install or update, the container is stopped rather than left to swap - on RE:NODE it restarts clean - and what remains is a half-written install with a 0x602-style state. Re-running the update with validate repairs it. If it keeps happening, the plan is too small for that game's install step; why your game server keeps restarting explains how to tell. The panel console shows SteamCMD's output line for line and graphs disk use against the plan's limit, which is usually enough to see which of the causes above you hit; the console guide shows where.

FAQ#

Is "Missing configuration" a problem with my server?

Usually not. It means SteamCMD could not get a usable configuration for that app from Steam - most often a stale app info cache, the wrong app id or a transient failure. Retry once, check the id is the dedicated server's rather than the game's, then delete the appcache folder in SteamCMD's directory and run again.

What does "state is 0x202 after update job" mean?

The update stopped while the app still needs it: flag 0x2 is "update required" and 0x200 is "update paused". In practice it is almost always a disk that ran out of space during the download. Free space on the install volume, leave 20-30% headroom, and run the update with validate.

Why does SteamCMD say "No subscription" when the server is free?

Because the server tool for that game is not free to anonymous logins. DayZ, Arma 3 and Project Zomboid need a Steam account that owns the game. The same message appears if the login silently failed earlier in the output, so check that the login line ended in OK.

Should I run SteamCMD as root to stop permission errors?

No. It makes the next update fail instead, because the files it writes belong to root and the service user cannot replace them. Run SteamCMD as the same ordinary user that runs the server, chown the install directory to that user once, and the permission errors stop.

Can I safely delete SteamCMD's appcache folder?

Yes. It is a cache of app metadata that SteamCMD rebuilds on the next run, and it holds no game files, saves or credentials. Do not confuse it with steamapps inside your install directory, which holds the app manifest and Workshop records.

How do I fix SteamCMD on a fresh 64-bit Linux install?

Enable 32-bit packages and install the 32-bit C and C++ runtime: on Debian and Ubuntu, dpkg --add-architecture i386 followed by apt install lib32gcc-s1 (or lib32gcc1 on older releases), and lib32stdc++6 if it still complains. On RHEL-family systems, glibc.i686 and libstdc++.i686.