43818


**CentOS7で、1つのサービス起動したら、5個ぐらいデーモン起動させたいのですが**  
・ExecStart欄で、指定ディレクトリ以下全て起動、みたいな指定はできないでしょうか？  
・あるいは、複数指定出来ないでしょうか？

・現状

[code]

    [Service]
    ExecStart=/opt/hoge
    
[/code]

* * *

・試したこと

[code]

       [Service]
        ExecStart=/opt/hoge
        ExecStart=/opt/hoge2
    
[/code]

・上記のように書いたら、下記エラーとなりました

> Invalid argument.

* * *

**追記**  
・複数のソケットファイルを動かすことを想定  
・/run/go/app/の下に、hoge1.sock と hoge2.sock を作成したい

・hoge1.go

[code]

    package main
    
    import (
        "os"
        "fmt"
        "net"
        "net/http"
        "net/http/fcgi"
    )
    
    func handler(res http.ResponseWriter, req *http.Request) {
        fmt.Fprint(res, "Hello World! 1")
    }
    
    func main() {
        os.RemoveAll("/run/go/app/hoge1.sock")
        l, err := net.Listen("unix", "/run/go/app/hoge1.sock")
        if err != nil {
            return
        }
        http.HandleFunc("/", handler)
        fcgi.Serve(l, nil)
    }
    
[/code]

※hoge2.goは、上記で「hoge1」を「hoge2」へ置換

複数起動する場合の手順

[code]

    go build hoge1.go
    
    ./hoge1
    
[/code]

・hoge1.sockファイルが作成されることを確認  
※hoge2も同様

・build結果のhoge1 と hoge2 を run-parts でサービス登録  
・一旦ソケットファイルを削除して起動させてみたら、hoge1.sockだけ作成されました


CC BY-SA 4.0
2018-05-02T14:23:10.327
43739
2020-01-07T03:36:13.003
2020-01-07T03:36:13.003
3060
7886
question
centos systemd
CentOS7サービス登録する際、[Service] ExecStartで複数起動指定したい


`run-parts` が使えますね。Debian 由来のコマンド (シェルスクリプト) ですが、CentOS のはあまり柔軟性がないのが難点。

`/path/to/commands-dir` ディレクトリ下に実行ファイルが置かれているなら:

[code]

    [Service]
    ExecStart=/usr/bin/run-parts /path/to/commands-dir
    
[/code]


CC BY-SA 4.0
2018-05-02T16:34:50.683
43748
2018-05-02T16:34:50.683
3061
43739
answer


以下でいかがでしょうか?

[code]

    [Service]
    Type=forking
    WorkingDirectory=/path/to/dir
    ExecStart=/bin/bash -c 'for x in *; do ./$x & done'
    
[/code]

* * *

`Type=forking` は、昔からあるデーモンのように、

  * fork して
  * 親プロセスは終了する

というプログラムのためのものです。

一方 `Type=simple` は、fork しない単純なプログラムのためのものです。

`Type=forking` の場合は、systemd は実行したプロセスが子プロセスを残して終了することを期待するのに対して、  
`Type=simple` の場合は、systemd は実行したプロセスが終了しないことを期待します。

今回の場合、bash 自体はすぐに終了するため、`Type=forking` としました。

また、bash の `-c` オプションは、その文字列をそのまま実行する、というものです。

  * `bash '文字列'`

その文字列をファイル名として、そのファイルの中身を実行する。

  * `bash -c '文字列'`

その文字列を実行する。

go の compile とは全く無関係です。というか、私のこの回答に go に依存した箇所は一切ありません。

`for x in *; do ./$x & done` は、一行で書くと解りにくいので、以下のように分解できます。

[code]

    for x in *
    do
      ./$x &
    done
    
[/code]

カレントディレクトリにある全てのファイルを background で実行しているだけです。  
つまり、カレントディレクトリに `hoge1`, `hoge2`, `hoge3` があるなら、

[code]

    ./hoge1 &
    ./hoge2 &
    ./hoge3 &
    
[/code]

を実行しているだけ、ということです。

カレントディレクトリは、`WorkingDirectory=/path/to/dir` で指定しています。


CC BY-SA 4.0
2018-05-06T10:54:56.703
43818
2018-05-07T02:21:28.687
2018-05-07T02:21:28.687
5288
5288
43739
answer