From 0364a7ad79cf779bd2f79c2597b9002841607882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 14 Aug 2023 15:57:22 +0200 Subject: [PATCH] Merge pull request 'Restartable workers' (#104242) from restartable-workers into main --- .../content/usage/worker-actions/_index.md | 80 ++++++++++++++++++ .../usage/worker-actions/worker_actions.webp | Bin 0 -> 12258 bytes 2 files changed, 80 insertions(+) create mode 100644 web/project-website/content/usage/worker-actions/_index.md create mode 100644 web/project-website/content/usage/worker-actions/worker_actions.webp diff --git a/web/project-website/content/usage/worker-actions/_index.md b/web/project-website/content/usage/worker-actions/_index.md new file mode 100644 index 00000000..a3bad566 --- /dev/null +++ b/web/project-website/content/usage/worker-actions/_index.md @@ -0,0 +1,80 @@ +--- +title: Worker Actions +--- + +The Worker Actions menu can be found in the *Workers* tab of Flamenco Manager's +web interface. By default it shows *Choose an action...*, and the *Apply* button +will be disabled until a specific action is chosen. + +![Screenshot of the Worker Actions menu in the Flamenco Manager web interface](worker_actions.webp) + +The available actions are: + + + +| Menu Item | Effect | +|----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| +| Shut Down (after task is finished) | Wait until the current task is done, then stop the worker. It will exit with status code `0`, indicating a clean shutdown. | +| Shut Down (immediately) | Abort the current task, and return it to the Manager for requeueing. Then stop the worker process like described above. | +| Restart (after task is finished)* | Wait until the current task is done, then stop the worker. It will exit with the configured status code, indicating a desire to restart. | +| Restart (immediately)* | Abort the current task, and return it to the Manager for requeueing. Then restart the worker process like described above. | +| Send to Sleep (after task is finished) | Let the worker sleep after finishing its current task. | +| Send to Sleep (immediately) | Let the worker sleep immediately. Its current task is aborted and requeued by the Manager. | +| Wake Up | Wake the worker up. A sleeping worker can take a minute to respond. | + +* The 'Restart' options are only available when the selected worker is marked as 'restartable'. See below. + +## Shut Down & Restart actions + +Both the 'Shut Down' and 'Restart' actions stop the Worker process. + +Shutting down the worker will make it exit succesfully, with status code `0`. + +Restarting the worker is only possible if it was started or configured with a +'restart exit code'. This can be done by using the `-restart-exit-status 47` +commandline option, or by settings this code in the [worker config file][wconfig]. +Requesting a worker restart will make it exit with the configured status code. + +It is up to the process management system (for example [systemd][systemd]) to +respond to these exit status code correctly. Here is an example systemd service +unit file that shows how to set this up on Linux: + +```systemd +[Unit] +Description=Flamenco Worker connecting to Manager on localhost +Documentation=https://localhost:8080/ +After=network.target + +[Service] +Type=simple +CPUSchedulingPolicy=idle +Nice=19 + +WorkingDirectory=/home/flamenco +# Tell the Worker that it should exit with status code 47 in order to restart. +ExecStart=/home/flamenco/flamenco-worker -manager http://localhost:8080/ -restart-exit-code 47 + +User=flamenco +Group=flamenco + +# Make systemd restart the service on exit code 47, as well as +# 'failure' codes (such as hard crashes). +RestartForceExitStatus=47 +Restart=on-failure + +EnvironmentFile=-/etc/default/locale + +[Install] +WantedBy=multi-user.target +``` + +[wconfig]: {{< ref "/usage/worker-configuration" >}} +[systemd]: https://systemd.io/ + +{{< hint type=note >}} +The 'Shut Down' and 'Restart' actions only relate to the Flamenco Worker process. They do **not** shut down or restart the computer itself. +{{< /hint >}} diff --git a/web/project-website/content/usage/worker-actions/worker_actions.webp b/web/project-website/content/usage/worker-actions/worker_actions.webp new file mode 100644 index 0000000000000000000000000000000000000000..875197226f0fac0a3f29dafc3857745d861f35f5 GIT binary patch literal 12258 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