[GH-ISSUE #4584] [Feature]: LGSM would utilize user-provided file for CRONTAB jobs #2852

Open
opened 2026-02-27 03:05:49 +03:00 by kerem · 1 comment
Owner

Originally created by @irobot73 on GitHub (Jun 1, 2024).
Original GitHub issue: https://github.com/GameServerManagers/LinuxGSM/issues/4584

User story

As a LGSM user, I want LGSM to create its instance of CRONTAB jobs from a user-provided file to allow customization & rapid (re)deployment

Game

7Days2Die

Linux distro

Ubuntu 22.04

Command

command: console

Further information

Would like to be able to create a file {EG: '.crontab'} in the /DATA folder that, if present, will be used to generate that docker's instance of all scheduled jobs via CRONTAB.

As, upon every STOP/START+ of the container, I have to manually modify CRONTAB via the console (miss a few & becomes quite tedious, running multiple servers) since it resets.

Keep the .YML clean(er) as well.

Default upon starting-up:

linuxgsm@599e2cfa8d46:/app$ crontab -l
*/60 * * * * /app/sdtdserver update > /dev/null 2>&1

vs. (mock code change)

[ -f "${CRONTAB_FILE}" ]]; then
     cat /data/.config|crontab -
fi

Giving (mock from file):

linuxgsm@599e2cfa8d46:/app$ crontab -l
## EVERY SUN @ 00:00
0 0 * * 0 /usr/bin/truncate --size 0 /data/log/crontab.log /data/log/rcon.log
## EVERY SUN @ 00:30
30 0 * * 0 /app/*server update-lgsm >> /data/log/crontab.log 2>&1
## EVERY DAY @ 05:00
1 5 * * * /data/RCON/rcon_send_backup_msg.sh sdtd 1 >> /data/log/crontab.log 2>&1
2 5 * * * /data/my_backup.sh >> /data/log/crontab.log 2>&1
## EVERY M,W,F @ 05:30
0 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 30 >> /data/log/crontab.log 2>&1
15 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 15 >> /data/log/crontab.log 2>&1
20 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 10 >> /data/log/crontab.log 2>&1
25 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 5 >> /data/log/crontab.log 2>&1
29 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 1 >> /data/log/crontab.log 2>&1
30 5 * * 1,3,5 /app/*server restart >> /data/log/crontab.log 2>&1

Edit (6/9/24)
Hand-jammed a proof of concept:

sudo nano /app/lgsm/modules/command_start.sh

Find:

fn_print_dots "${servername}"
if [ "${shortname}" == "jk2" ]; then
        fn_start_jk2
else
        fn_start_tmux
fi

New code to add just below:

# If user defined CRONTAB is present, ingest
if [ -f "${HOME}/.crontab" ]; then
        fn_script_log_info "Importing CRONTAB file"
        cat "${HOME}/.crontab" | crontab -
else
        fn_script_log_info "No CRONTAB file to import"
fi

Post-Addition:

...
fn_print_dots "${servername}"
if [ "${shortname}" == "jk2" ]; then
        fn_start_jk2
else
        fn_start_tmux
fi

# If user defined CRONTAB is present, ingest
#
#     Better to utilize 'config-lgsm/_default.cfg' for cross-server usage, ease of use?
#
if [ -f "${HOME}/.crontab" ]; then
        fn_script_log_pass "Importing CRONTAB file"
        cat "${HOME}/.crontab" | crontab -
else
        fn_script_log_info "No CRONTAB file to import"
fi

# Remove starting lockfile when command ends.
...

Test output:

Jun 09 13:42:24.719 pwserver: START: PASS: Started LinuxGSM
Jun 09 13:42:24.822 pwserver: START: PASS: Started LinuxGSM
Jun 09 13:42:24.824 pwserver: START: PASS: Importing CRONTAB file
Jun 09 13:42:24.834 pwserver: RESTART: INFO: LinuxGSM version: v24.2.1
Jun 09 13:42:24.835 pwserver: RESTART: PASS: core_exit.sh exiting with code: 0
Originally created by @irobot73 on GitHub (Jun 1, 2024). Original GitHub issue: https://github.com/GameServerManagers/LinuxGSM/issues/4584 ### User story As a LGSM user, I want LGSM to create its instance of CRONTAB jobs from a user-provided file to allow customization & rapid (re)deployment ### Game 7Days2Die ### Linux distro Ubuntu 22.04 ### Command command: console ### Further information Would like to be able to create a file {EG: '.crontab'} in the /DATA folder that, if present, will be used to generate that docker's instance of all scheduled jobs via CRONTAB. As, upon *every* STOP/START+ of the container, I have to manually modify CRONTAB via the console (miss a few & becomes quite tedious, running multiple servers) since it resets. Keep the .YML clean(er) as well. Default upon starting-up: ``` linuxgsm@599e2cfa8d46:/app$ crontab -l */60 * * * * /app/sdtdserver update > /dev/null 2>&1 ``` vs. (mock code change) ``` [ -f "${CRONTAB_FILE}" ]]; then cat /data/.config|crontab - fi ``` Giving (mock from file): ``` linuxgsm@599e2cfa8d46:/app$ crontab -l ## EVERY SUN @ 00:00 0 0 * * 0 /usr/bin/truncate --size 0 /data/log/crontab.log /data/log/rcon.log ## EVERY SUN @ 00:30 30 0 * * 0 /app/*server update-lgsm >> /data/log/crontab.log 2>&1 ## EVERY DAY @ 05:00 1 5 * * * /data/RCON/rcon_send_backup_msg.sh sdtd 1 >> /data/log/crontab.log 2>&1 2 5 * * * /data/my_backup.sh >> /data/log/crontab.log 2>&1 ## EVERY M,W,F @ 05:30 0 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 30 >> /data/log/crontab.log 2>&1 15 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 15 >> /data/log/crontab.log 2>&1 20 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 10 >> /data/log/crontab.log 2>&1 25 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 5 >> /data/log/crontab.log 2>&1 29 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 1 >> /data/log/crontab.log 2>&1 30 5 * * 1,3,5 /app/*server restart >> /data/log/crontab.log 2>&1 ``` Edit (6/9/24) Hand-jammed a proof of concept: `sudo nano /app/lgsm/modules/command_start.sh` Find: ``` fn_print_dots "${servername}" if [ "${shortname}" == "jk2" ]; then fn_start_jk2 else fn_start_tmux fi ``` New code to add just below: ``` # If user defined CRONTAB is present, ingest if [ -f "${HOME}/.crontab" ]; then fn_script_log_info "Importing CRONTAB file" cat "${HOME}/.crontab" | crontab - else fn_script_log_info "No CRONTAB file to import" fi ``` Post-Addition: ``` ... fn_print_dots "${servername}" if [ "${shortname}" == "jk2" ]; then fn_start_jk2 else fn_start_tmux fi # If user defined CRONTAB is present, ingest # # Better to utilize 'config-lgsm/_default.cfg' for cross-server usage, ease of use? # if [ -f "${HOME}/.crontab" ]; then fn_script_log_pass "Importing CRONTAB file" cat "${HOME}/.crontab" | crontab - else fn_script_log_info "No CRONTAB file to import" fi # Remove starting lockfile when command ends. ... ``` Test output: ``` Jun 09 13:42:24.719 pwserver: START: PASS: Started LinuxGSM Jun 09 13:42:24.822 pwserver: START: PASS: Started LinuxGSM Jun 09 13:42:24.824 pwserver: START: PASS: Importing CRONTAB file Jun 09 13:42:24.834 pwserver: RESTART: INFO: LinuxGSM version: v24.2.1 Jun 09 13:42:24.835 pwserver: RESTART: PASS: core_exit.sh exiting with code: 0 ```
Author
Owner

@MicLieg commented on GitHub (Jan 18, 2025):

Could be a nice addition to PR https://github.com/GameServerManagers/LinuxGSM/pull/4508

<!-- gh-comment-id:2600158655 --> @MicLieg commented on GitHub (Jan 18, 2025): Could be a nice addition to PR https://github.com/GameServerManagers/LinuxGSM/pull/4508
Sign in to join this conversation.
No labels
Atomic
Epic
cannot reproduce
command: backup
command: console
command: debug
command: details
command: fast-dl
command: install
command: mods
command: monitor
command: post-details
command: restart
command: send
command: start
command: stop
command: update
command: update-lgsm
command: validate
command: wipe
distro: AlmaLinux
distro: Arch Linux
distro: CentOS
distro: Debian
distro: Fedora
distro: RedHat
distro: Rocky Linux
distro: Ubuntu
distro: openSUSE
engine: goldsrc
engine: source
game: 7 Days to Die
game: ARMA 3
game: Ark: Survival Evolved
game: Assetto Corsa
game: Avorion
game: BATTALION: Legacy
game: Barotrauma
game: Battalion 1944
game: Battlefield 1942
game: Black Mesa: Deathmatch
game: Blade Symphony
game: Call of Duty 2
game: Call of Duty 4
game: Call of Duty: United Offensive
game: Counter-Strike 1.6
game: Counter-Strike 2
game: Counter-Strike: Global Offensive
game: Counter-Strike: Source
game: Day of Infamy
game: Dayz
game: Death Match Classic
game: Don't Starve Together
game: ET: Legacy
game: Eco
game: Factorio
game: Factorio
game: Garry's Mod
game: Half-Life
game: Hurtword
game: Insurgecy
game: Insurgecy
game: Insurgency: Sandstorm
game: Just Cause 3
game: Killing Floor
game: Killing Floor 2
game: Left 4 Dead 2
game: Minecraft
game: Minecraft Bedrock
game: Mordhau
game: Multi Theft Auto
game: Mumble
game: Natural Selection 2
game: No More Room in Hell
game: Pavlov VR
game: Post Scriptum
game: Project Zomboid
game: Quake 3
game: QuakeWorld
game: Red Orchestra: Ostfront 41-45
game: Return to Castle Wolfenstein
game: Rising World
game: Rust
game: San Andreas Multiplayer
game: Satisfactory
game: Soldat
game: Soldier of Fortune 2
game: Squad
game: Squad 44
game: Starbound
game: Stationeers
game: Sven Co-op
game: Team Fortress 2
game: Teamspeak 3
game: Teeworlds
game: Terraria
game: The Front
game: Unreal Tournament 2004
game: Unreal Tournament 3
game: Unreal Tournament 99
game: Unturned
game: Valheim
game: Wurm Unlimited
game: Zombie Master Reborn
game: label missing
good first issue
help wanted
info: alerts
info: dependency
info: docker
info: docs
info: email
info: query
info: steamcmd
info: systemd
info: tmux
info: website
info: website
needs more info
outcome: duplicate
outcome: issue resolved
outcome: issue resolved
outcome: issue unresolved
outcome: pr accepted
outcome: pr rejected
outcome: unconfirmed
outcome: wontfix
outcome: wrong forum
potential-duplicate
priority
pull-request
type: bug
type: feature
type: feature
type: feature request
type: game server request
type: refactor
waiting response
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/LinuxGSM#2852
No description provided.