How to Disconnect Ghost FileMaker Sessions on Your Server

What are Ghosts Sessions?

When you lose your network connection or your FileMaker quits, sometimes your session doesn’t drop off on the FileMaker server. This becomes a problem when that session hogs up one of your license spots. This doesn’t seem to happen often, but when I talked prentices to colleagues at the annual FileMaker Developer Conference, I learned it happens more often than we think.

The Process to Eliminate Ghost Sessions

So, once we identify we have a problem, we can start cooking up a solution. This particular server happens to be Windows Server. First I thought about VB scripting or Power Shell scripting. To be honest I’ve written one small Power Shell script, but this seemed a little above my head. So, I thought, well, here’s a tool I know how to use: FileMaker. I wonder if it can do the job. It can, indeed.

The process is basically the following:

  1. Issue a command in Command Line to get a list of connected clients;
  2. Create records in a table;
  3. Compare them to see which ones are the same (same IP address or user);
  4. Issue a disconnect for everyone except for the newest connection.

So how do we do this from FileMaker? With the use of a plug-in, of course. In this case I grabbed the Base Elements plug-in, because it was already installed on the server.

The Base Elements plug-in can issue Command Line commands. I use it to get the list of connected clients:

BE_ExecuteSystemCommand ( “fmsadmin list clients -s -u <username>r -p <password>” )

The result comes back in fixed-width text format — which gave me a little headache, but I learned a lot from it. Fixed-width means that every word has a certain amount of space and the data is separated by an indeterminable number of spaces. To get that data into arrays, you have to calculate the position of the column headers.

Let (

[

text = GetValue ( $BE_output ; 1 ) ;

$pID = Position ( text ; "Client ID" ; 1 ; 1 );

$pUname = Position ( text ; "User Name" ; 1 ; 1 ) ;

$pCname = Position ( text ; "Computer Name" ; 1 ; 1 ) ;

$pCon = Position ( text ; "Connect Time" ; 1 ; 1 ) ;

$pDur = Position ( text ; "Duration" ; 1 ; 1 )

];

$pID  & ¶ &

$pUname  & ¶ &

$pCname  & ¶ &

$pCon  & ¶ &

$pDur

)

I then go through the result and create records from it. Now I have records to compare the timestamp on the similar records.

The way I do that is by setting up another table occurrence (user = user in my case) and then checking whether the record is a duplicate via this calculations:

TimeStamp ≠ Max ( UT__UtilityTable_User::TimeStamp )

Here is my table:

Utility Table
Utility Table

Disconnecting the Ghost Sessions

The last thing is to find the records that are marked duplicate and then loop through to issue a disconnect command for them:

# Loop through the dups and disconnect 

Go to Record/Request/Page [ First ]
Set Variable [ $rep; Value:1 ]
Set Variable [ $maxReps; Value:Get (FoundCount) ]

Loop 
# Disconnect the client(s) 
Set Variable [ $ID; Value:UT__UtilityTable::ID ]
Set Variable [ $command; Value:"fmsadmin disconnect client " & $ID & " -y " & " -u " & $username & " -p " & $password ] 
Set Variable [ $BE_output; Value:BE_ExecuteSystemCommand ( $command ) ]
Set Variable [ $error; Value:BE_GetLastError ]

If [ $error > 0 ] 
Send Mail [ Send yourself an email via SMTP so you know when there was a user disconnected.][ No dialog ]
End If 

Exit Loop If [ $rep = $maxReps ]

Go to Record/Request/Page [ Next ]

End Loop 

As you can see I’m using username and password variables above. Those are set in my script with the FileMaker Admin console access values I need to issue the command line commands.

Following these steps should help you eliminate ghost sessions in FileMaker and avoid overusing unnecessary license spots. Good luck! If you have any questions, let me know in a comment below or contact my team directly.

14 thoughts on “How to Disconnect Ghost FileMaker Sessions on Your Server”

  1. This is a fantastically useful article. The problem has definitely happened to me. Thanks very much for this tip.

  2. Agnes

    This doesn’t work… I have added cmd.exe /c to the start as per the BaseElements help but it just creates a ghost session of its own that refuses to disconnect and locks up the calling FileMaker file

    1. John,
      I’m sorry that FileMaker Server did not respond to the command. Just as FileMaker Server might not respond to a command you initiate from the Admin Console, so too might be the case with the command line. In that case I recommend using the Admin Console (or command line) to close all the hosted files, stop FileMaker Server, restart the server computer, and then restart FileMaker Server, if it is not set to do so automatically on startup.
      Best of Luck,
      Dawn

  3. Pingback: FileMaker 16 cURL, Ghost Sessions, Motivation - FileMakerProGurus

  4. Thank you, this works really well. However, fmsadmin does not appear to have an option for disconnecting without the user’s agreement. I am implementing a system which would request a user, who has logged in on more than one device, to log out on the other device. As such, the user will likely not be available to agree to the request on the more distant device. Is there any way to do this?

  5. Marc-Andre Desmarteau

    Hi, I thought this was our saving grace for one of our bigger client that constantly does ghost sessions. Unfortunately, it does the same thing as xjohn renfrew mentionned : it hangs, then keeps an infinite PSOS session on the server that is unclosable by server console or command line.

    I tried the same method at 3 other client’s database, and it worked flawlessly. It’s not about being on a Windows server as I’ve made it work on one, neither it is excessive security that would prevent command lines from being executed as I can to a remote session and easily execute the exact same command line and obtain the connection client list.

    Have you ever found a reason this would happen? I’m wondering if it’s related to what causes them to actually produce ghost sessions in the first place.

    1. Hi Marc-Andre,

      Our approach to monitoring and trying to kill ghost sessions has evolved since this article. We now try and use industry-standard monitoring tools like Zabbix (see our blog posts on monitoring) that can check for and them and can execute command line commands without having to try to do those from inside FM.

      As to main reasons for ghost sessions: in our experience it is often the use of ESS and/or trouble on the network (a saturated network, bad cabling, spotty wifi, failing network equipment that generates lots of disconnects).

  6. Marc-Andre Desmarteau

    Hi Wim, and thank you for your answer!

    That’s an interesting avenue, last question : sometimes, it we see stuck sessions on the server console and can close them from there (which would give the possibility for sure of doing it from an external software or command line). But other times, we have the same symptoms, but there is no session on the server that we can close.

    Are you aware if Zabbix would make possible to kick out more ips than the ones we see in the Filemaker Console?

    Thank you very much!

    1. Not sure I fully understand where the “more IPs than we see in the Console” would come from?
      But in general: no. Zabbix would have to use the available FMS tools to get a list of connected clients. Either through the Admin CLI or the Admin API. If you have connections that are not returned in those lists then Zabbix would not be aware of them.

      1. Marc-Andre Desmarteau

        Thanks, that’s what I thought! We’ll probably still look at something like Zabbix, because managing the visible connections is still worth it. I’ll continue looking for the invisible ones. Doesn’t happen often, but needs server restart when it does, as the users get ” (?) is modifying the record” error. I don’t have much hope, as Claris themselves don’t know any cause.

Leave a Comment

Your email address will not be published.