The bans.txt isn't the primary server bans file. The banned_user.cfg file is.
We only use bans.txt to write additional info -
1) Temp bans. Source server doesn't store temporary bans across server sessions, so, we wrote ULX to remember them across server restarts.
2) Ban reason. (Source's banned_users.cfg doesn't do this)
3) Name of player at time of ban. (Source's file doesn't store this.
4) Admin who banned player (Source's file doesn't do this)
ULX loads the server's 'real' banned users file at server startup.
It then adds to the server's primary file, and bans.txt, when someone is banned.
If there is any file corruption to the servers gmod/data/ulib/users.txt or groups.txt, ULib will back them up before recreating them and they'd be in the same folder.
If either one is 0 bytes, there is a catastrophic conflict or exploit going on with your server, and ULX is likely NOT the root cause.
While your server is up and running, with you and a few players on, please run a "ulx debuginfo" from the server console.
It will create a file and tell you where it put it. Grab that file, and attach it to your next post.