-
Notifications
You must be signed in to change notification settings - Fork 5.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add --idle-timeout
to shutdown code-server when there isn't an active connection
#1636
Comments
No it does NOT replace the task of the heartbeat. The heartbeat to an external file, allows an external monitor to shutdown the docker instance, not shutdown code-server itself. In fact the monitor itself may not even be running on the same machine in a multi-node docker environment. There can be a lot more to the docker instance than code-server itself, such as an apache web server, or a java script node the user is developing in the isolated environment. A way to determine if the user is still active (via code-server) is an integral part of this, and would be a vastly harder thing to monitor without the availability of the heartbeat file. In code-server v1 the file was actually a log that updated each time the web client requested an update, letting us know if the user still had a connected web server or not. While the web client was connected (even if the user was away from their terminal), the heartbeat would still update. So in a way heartbeat does not report 'user idle' status but 'connected' status. So looking at it that way "heartbeat" is slightly different to the true meaning of "idle" as in the user is not really active (making changes, clicks, or typing). |
In a more general way. You may not actually want code-server to just shutdown, when not used for a certain length of time. It is only one possible action, in that situation. As mentioned in own case we want to shutdown the docker instance, and not code-server itself. Now a -idle-timeout is still a good option... And I am certain many people would like to make use of such an option, especially when not using docker containers. But it is not the one needed in my setup! TLDR... --idle-timeout is a good addition, but it is not a replacement for heartbeat. |
@antofthy So instead of checking the heart beat file, you'd just check to see whether Can you not do that? |
Yes I could, but not as simply...
For example with heart beat I can do the following on the master node of cluster, for all containers (docker services)...
This shows at this moment I have 3 users using the system, all with a 'web-dev' code server environment (with apache, nodejs software) and they are all active (used system in last 5 minutes) Time its been idle feedback is lost without heartbeat. heartbeat is a LOT more versitile! |
Why the push to get rid of heartbeat. Is it causing some problem I don't know about? |
No push, less features the better. I understand your concerns, we'll keep both! 🎉 |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no activity occurs in the next 5 days. |
@nhooyr your last response sounded like you were going to add an For running #!/bin/bash
now=$(date +%s)
fp=~/.local/share/code-server/heartbeat
# The heartbeat file does not exist before a browser session is connected,
# but we also want to exit if that never happens.
if [[ ! -f $fp ]]; then
# No session yet.
# Create the heartbeat file to mark the startup time.
touch $fp
fi
heartbeat=$(date +%s -r $fp)
# NOTE: This was my original block and doesn't work 👇
#if (( (now-heartbeat) > 300 )); then
# echo "Heartbeat file older than 5 minutes."
# # Does not work, because Docker main processes ignore signals: kill -s SIGTERM 1
# exit 1
#fi
if (( (now-heartbeat) > 300 )); then
echo "Heartbeat older than 5 minutes. Terminating the code-server process."
pkill -f code-server
exit 1
else
echo "Recent heartbeat detected."
exit 0
fi
So IIUC there's no easy way to stop the Docker container "from the inside", but an external supervisor is needed. Please advise if there's a way. |
That is correct, only the heartbeat mechanism exists at the moment.
Could the healthcheck script kill code-server instead? Maybe with a
pkill -f. Or perhaps the healthcheck script could wrap/spawn
code-server so it can store code-server's PID.
|
Yes, that works! I don't quite understand why, but fair enough. Thanks a lot! |
The only way to stop a docker container from the inside (unless special docker control is also given - but that is a special case) is to kill off whatever process the container is waiting on. That is the foreground 'START' process. Basically that means you need specific knowledge of the set up so as to know what needs to be killed. The 'heartbeat' file is very useful as if it is mounted from a persistent store (docker volume) it is accessible outside the docker container, where a global supervisory program can handle things. However a My problem now is I have one container with BOTH code-server and jupyter notebook running. Arrggghhh.... |
I'll tag @code-asher to see if he has on ideas on how he would solve this |
Is this still a feature that's in the works? |
No one is working on this, as far as I know, and it is not on any
roadmap. PRs welcome though!
|
It was added an an alternative to using 'heartbeat'. The university I work for uses heartbeat to shutdown student virtual docker systems, when users stop using them. It works well, mostly because I can access the heartbeat outside the docker environment. Basically a cron script runs ever 10 minutes looking at active services, to see if heartbeat stopped updating for more than an 1 hour, then shotdown that users docker environment, no matter which machine in the cluster the docker service is running on. It also checks on 'control inputs' and even some web service connection (control server does not open/close connections). The "--idle-timeout" did not provide that level flexibility. On the other hand there is a bug in that heartbeat stops updating if the user does NOT open new files for editing every so often, (just editing a single file or using console). So even it could use some improvement. |
We could use the healthz endpoint to check the status even from outside the VM or container where code-server is running: As said in the docs' FAQ: What is the healthz endpoint?You can use the
I just saw this and currently exploring. |
If there hasn't been an active connection to code-server in X minutes, we should exit with status 0.
This would replace the heartbeat file (#1115) as a more friendly option.
cc @code-asher @antofthy
The text was updated successfully, but these errors were encountered: