From 76710d58fa8aa8ccd3651472a35202705acd7a26 Mon Sep 17 00:00:00 2001 From: Ryan Burnette Date: Sun, 4 Aug 2019 01:36:46 +0000 Subject: [PATCH] progress --- README.md | 20 +++++++++++++++++++ .../etc/systemd/system/_name_.service.tmpl | 6 +++--- runner/runner.go | 5 +++++ serviceman.go | 7 ++++++- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8b945b1..6cc430a 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Also, I wanted a reasonable way to install [Telebit](https://telebit.io) on Wind - node - python - ruby + - path - Logging - Debugging - Windows @@ -398,6 +399,25 @@ See **Using with scripts** for more detailed information. +
+Setting $PATH + +You can set the `$PATH` for your service like this: + +```bash +sudo serviceman add ./myservice --path "/home/myuser/bin" +``` + +Snapshot your actual path like this: + +```bash +sudo serviceman add ./myservice --path "$PATH" +``` + +Remember that this takes a snapshot and sets it in the configuration, it's not +a live reference to your path. +
+ ## Hints - If something goes wrong, read the output **completely** - it'll probably be helpful diff --git a/manager/dist/etc/systemd/system/_name_.service.tmpl b/manager/dist/etc/systemd/system/_name_.service.tmpl index a53e67a..b05fbe0 100644 --- a/manager/dist/etc/systemd/system/_name_.service.tmpl +++ b/manager/dist/etc/systemd/system/_name_.service.tmpl @@ -22,9 +22,6 @@ Wants=network-online.target systemd-networkd-wait-online.service {{ end -}} [Service] -{{ if .Path -}} -PATH={{ .Path }} -{{ end -}} # Restart on crash (bad signal), but not on 'clean' failure (error exit code) # Allow up to 3 restarts within 10 seconds # (it's unlikely that a user or properly-running script will do this) @@ -38,6 +35,9 @@ User={{ .User }} Group={{ .Group }} {{ end -}} +{{- if .Envs }} +Environment="{{- range $key, $value := .Envs }}{{ $key }}={{ $value }};{{- end }}" +{{- end }} {{ if .Workdir -}} WorkingDirectory={{ .Workdir }} {{ end -}} diff --git a/runner/runner.go b/runner/runner.go index ccd3883..0ae3ebb 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -78,6 +78,11 @@ func Start(conf *service.Service) error { if "" != conf.Workdir { cmd.Dir = conf.Workdir } + if len(conf.Envs) > 0 { + for k, v := range conf.Envs { + cmd.Env = append(cmd.Env, k+"="+v) + } + } err = cmd.Start() if nil != err { fmt.Fprintf(lf, "[%s] Could not start %q process: %s\n", time.Now(), conf.Name, err) diff --git a/serviceman.go b/serviceman.go index 10d9cdd..9d49b99 100644 --- a/serviceman.go +++ b/serviceman.go @@ -70,6 +70,7 @@ func add() { forUser := false forSystem := false dryrun := false + pathEnv := "" flag.StringVar(&conf.Title, "title", "", "a human-friendly name for the service") flag.StringVar(&conf.Desc, "desc", "", "a human-friendly description of the service (ex: Foo App)") flag.StringVar(&conf.Name, "name", "", "a computer-friendly name for the service (ex: foo-app)") @@ -79,7 +80,7 @@ func add() { flag.BoolVar(&forSystem, "system", false, "attempt to add system service as an unprivileged/unelevated user") flag.BoolVar(&forUser, "user", false, "add user space / user mode service even when admin/root/sudo/elevated") flag.BoolVar(&force, "force", false, "if the interpreter or executable doesn't exist, or things don't make sense, try anyway") - flag.StringVar(&conf.Path, "path", "", "set the path for the resulting systemd service") + flag.StringVar(&pathEnv, "path", "", "set the path for the resulting systemd service") flag.StringVar(&conf.User, "username", "", "run the service as this user") flag.StringVar(&conf.Group, "groupname", "", "run the service as this group") flag.BoolVar(&conf.PrivilegedPorts, "cap-net-bind", false, "this service should have access to privileged ports") @@ -164,6 +165,10 @@ func add() { ass = append(ass, fmt.Sprintf(" --name %s", conf.Name)) ass = append(ass, "") } + if "" != pathEnv { + conf.Envs = make(map[string]string) + conf.Envs["PATH"] = pathEnv + } exepath, err := findExec(flagargs[0], force) if nil != err {