Python で書かれたサーバープログラムをデーモン化と自動起動するため  
[Amazonlinux2でsupervisorを動かすまで](http://zuntan02.hateblo.jp/entry/2019/06/27/205849)

上記ページを参考に supervisor というのを AWS EC2 上に導入したいです

対象の EC2 には pyenv が /home/ec2-user/.pyenv に入っており  
ec2-user の .bash_profile でパスを通すことで使っていますが  
root ユーザではパスを通すか絶対パスを指定しないと pyenv 管理下のコマンドが見つかりません

この pyenv 管理下の pip install でインストールした supervisor を  
ユニットファイル内で使うにはどうすればいいのでしょうか

/usr/local とか共有ファイルに入れ直すと既存のスクリプト等に影響が出る可能性があるので  
なるべく pyenv はこのままの状態にしたいです

```

    [Unit]
    Description=Supervisor process control system for UNIX
    Documentation=http://supervisord.org
    After=network.target
    
    [Service]
    ExecStart=source /home/ec2-user/.bash_profile; supervisord -n -c /etc/supervisord.conf
    ExecStop=source /home/ec2-user/.bash_profile; supervisorctl $OPTIONS shutdown
    ExecReload=source /home/ec2-user/.bash_profile; supervisorctl $OPTIONS reload
    KillMode=process
    Restart=on-failure
    RestartSec=50s
    
    [Install]
    WantedBy=multi-user.target
    
```

試しにこう書いてみたり

```

    ExecStart=/home/ec2-user/.pyenv/bin/pyenv exec supervisord -n -c /etc/supervisord.conf
    
```

と書いてみたりして

```

    sudo systemctl start supervisord
    
```

を実行しても supervisord の本体が起動しません

* * *

**具体的に行なった手順**

最初の pip がすでに入っていたのとログローテートを後回しにした以外は
[参考にしたブログ](http://zuntan02.hateblo.jp/entry/2019/06/27/205849) と完全に同じです

```

    pip install supervisor
    
```

この時点で ec2-user では supervisord, supervisorctl が使えます

```

    echo_supervisord_conf > supervisord.conf
    
```

`vi supervisord.conf` でブログと同じく logfile, pidfile, include を編集

```

    sudo mv supervisord.conf /etc/
    sudo mkdir /etc/supervisord.d
    sudo mkdir /var/log/supervisor/
    
```

`vi /etc/systemd/system/supervisord.service`  
で質問文の内容でファイル作成

`sudo systemctl start supervisord` を実行しても `ps -ef | grep supervisor`
で何も起動してないです

> 起動時のエラーログ

はどこにたまるんでしょうか

/var/log/supervisor には何も溜まってないです  
（そもそもコマンドにパスが通ってないと推測してるので）
CC BY-SA 4.0
2020-01-06T08:52:30.040
61999
2022-11-12T14:06:30.750
2020-01-07T04:30:12.403
3060
question
linux pyenv systemd supervisor
systemdのユニットファイル内でのパスの通し方
```

    #!/bin/bash
    source /home/ec2-user/.bash_profile
    supervisord -n -c /etc/supervisord.conf
    
```

という起動スクリプトファイルを /home/ec2-user/bin/start_supervisord.sh において  
ExecStart に  
`bash /home/ec2-user/bin/start_supervisord.sh`  
と書いたところ起動したので妥協しようと思ってますが

サービスファイルがあるのにさらに起動スクリプトまで別に用意するのは冗長なので  
サービスファイルだけで起動できるようにしたいです

このファイルを直接実行するのと中身の２行を ; でつないだコマンドを実行するのと  
なぜ差が生まれるのかも不明なのですが…
CC BY-SA 4.0
2020-01-07T02:56:34.717
62016
2020-01-07T02:56:34.717
61999
answer