Bottle.serverDirectory takes the device and inode from FileManager.attributesOfItem(atPath:), which describes a symlink itself, not what it points to. Wine resolves the prefix before it names its server directory, so for a bottle that is a symlink the two disagree. processes() then looks in a directory that does not exist and finds nothing, and takeDown() reports the bottle as down once wineserver -k has killed the server alone.
Seen on 2026-09-29 with ~/Library/Sake/bottles/ex, a symlink to /Volumes/EX/Sake/ex on an external disk:
|
device-inode |
server directory |
| the symlink, which sake reads |
1000012-8fa3a84 |
does not exist |
| the prefix, which Wine uses |
1000016-116a1 |
/tmp/.wine-502/server-1000016-116a1 |
Pressing Stop on Steam killed wineserver and nothing else. Nineteen processes stayed up with ppid 1, holding that directory open: steam.exe, seven steamwebhelper.exe, steamservice.exe, two explorer.exe, winemenubuilder.exe and the prefix's services. The library showed Play as though Steam had quit.
rename and remove begin with takeDown() as well, so the same bottle could be renamed or moved to the Trash with its processes still running in it. That has not been tried.
Bottle.serverDirectorytakes the device and inode fromFileManager.attributesOfItem(atPath:), which describes a symlink itself, not what it points to. Wine resolves the prefix before it names its server directory, so for a bottle that is a symlink the two disagree.processes()then looks in a directory that does not exist and finds nothing, andtakeDown()reports the bottle as down oncewineserver -khas killed the server alone.Seen on 2026-09-29 with
~/Library/Sake/bottles/ex, a symlink to/Volumes/EX/Sake/exon an external disk:1000012-8fa3a841000016-116a1/tmp/.wine-502/server-1000016-116a1Pressing Stop on Steam killed wineserver and nothing else. Nineteen processes stayed up with ppid 1, holding that directory open:
steam.exe, sevensteamwebhelper.exe,steamservice.exe, twoexplorer.exe,winemenubuilder.exeand the prefix's services. The library showed Play as though Steam had quit.renameandremovebegin withtakeDown()as well, so the same bottle could be renamed or moved to the Trash with its processes still running in it. That has not been tried.