Add Windows support#230
Open
ajw1980 wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add Windows support
Closes #102
Adds cross-compilation and runtime support for Windows. Tested running as a Windows service with a real crontab firing on schedule.
Approach
Build tags are used only where a symbol literally doesn't exist on Windows and would cause a compile error regardless of code path (
Setpgid,SIGUSR2,ForkExec,Wait4,SIGCHLD). Everything else usesruntime.GOOSto keep the number of new files minimal.Three new files:
cron/unix.go/cron/windows.go— platform split forsysProcAttr()sinceSetpgidwon't compile on Windows even in dead codewindows.go— all main package Windows stubs in one place:forkExecno-op, syntheticreloadSigsentinel, and a Windows-appropriatesignalListFour modified files:
reaper.go—//go:build !windowstag;reloadSignalandsignalListmoved here for the Unix sidecron/cron.go—sysProcAttr()call;runtime.GOOSto select-cvs-Commandshell flagcrontab/crontab.go—runtime.GOOSto default topowershell.exeon Windows instead of/bin/shmain.go—syscall.SIGUSR2replaced withreloadSignalthroughout;syscallimport removedPlatform notes
Default shell:
powershell.exewith-Command. Override withSHELL=in your crontab as usual.Crontab reload:
SIGUSR2can't be delivered to a Windows process externally so that path is a no-op on Windows. The-inotifyflag works correctly viaReadDirectoryChangesWand is the recommended reload mechanism on Windows.Process reaping:
forkExec()is stubbed withlogrus.Fatal. The reaper is only entered whenos.Getpid() == 1, which is never true on Windows, so it's dead code in practice.