2017-03-06 10 views
1

プログラムmy_progは起動後に起動されます。 root:rootが所有するUnixドメインソケット/tmp/my_prog.sockを作成します。 システムパスユニットの設計方法は?

は、私は以下のことをやろうとしています:

  • 変更www-data:www-dataへのソケットファイルの所有者を、それが作成された後。
  • プログラムの終了後にソケットファイルを削除します。

これは、ユニットファイルmy_prog.serviceの私の最初のバージョンである:

  • /tmp/my_prog.sockの所有者に変更されることはありません - 常にroot:root:このバージョンでは、二つの問題があり

    [Unit] 
    Description=My Program 
    After=network.target 
    
    [Service] 
    ExecStart=/usr/local/bin/my_prog 
    ExecStartPost=chmod www-data:www-data /tmp/my_prog.sock 
    ExecStopPost=rm -f /tmp/my_prog.sock 
    
    [Install] 
    WantedBy=multi-user.target 
    

  • /tmp/my_prog.sockこのサービスを停止した後は削除されません。ソケットファイルを作成

    • chmod実行my_prog前に終了し、
    • rm実行する前にmy_program

    は、私はそれがあまりにも早くコマンドchmodrmが実行されつつあることは私に、このような予期せぬ結果をもたらすと思います終了します(my_programは、ソケットファイルが実行中に削除されることを禁止していますか?)。

    ファイルmy_prog.service

    [Unit] 
    Description=My Program 
    After=network.target 
    
    [Service] 
    ExecStart=/usr/local/bin/my_prog 
    
    [Install] 
    WantedBy=multi-user.target 
    

    ファイルmy_prog-socket.path

    [Unit] 
    Description=My program - notify socket existence 
    
    [Path] 
    PathExists=/tmp/my_prog.sock 
    

    ファイルmy_prog-socket.service従っ何

は、どちらか私に正しい結果を出すことができない私の第二版、以下のとおりです。

[Unit] 
Description=My program - change owner and remove socket 

[Service] 
ExecStart=chown www-data:www-data /tmp/my_prog.sock 
ExecStopPost=rm -f /tmp/my_prog.sock 

私はすべてのトリックを使い果たしました。 ユニットファイルに何が問題なのですか? 上記よりエレガントなデザインはありますか?

ありがとうございます!

P.S.:興味がある人のために、このレガシーバージョン/etc/init.d/my-prog作品予想通り、少なくとも:

#!/bin/sh 
### BEGIN INIT INFO 
# Provides:   my-program 
# Default-Start: 2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: My Program 
# Description:  My Program 
### END INIT INFO 


PATH=/sbin:/bin:/usr/sbin:/usr/bin 
DAEMON=/usr/local/bin/my_prog 
NAME=my-program 
DESC="My Program" 
SCRIPTNAME=/etc/init.d/$NAME 
PIDFILE=/var/run/my-prog.pid 
SOCKET_FILE="/tmp/my-prog.sock" 

test -x $DAEMON || exit 0 

grant_socket_access() 
{ 
    #Wait program to create socket. 
    count=1 
    while [ "$count" -lt "50" ] 
    do 
     if [ -S $SOCKET_FILE ] 
     then 
      chown www-data:www-data $SOCKET_FILE 
      return 0 
     fi 
     sleep 0.2 
     count=`expr $count + 1` 
    done 
    echo >&2 "$NAME fails to grant access to Unix socket file: $SOCKET_FILE" 
    return 1 
} 

. /lib/lsb/init-functions 

case "$1" in 
    start) 
     log_daemon_msg "Starting $DESC" $NAME 
     rm -f $SOCKET_FILE 
     if start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -b -m 
     then 
      grant_socket_access 
     else 
      rm -f $SOCKET_FILE 
     fi 
     log_end_msg $? 
     ;; 
    stop) 
     log_daemon_msg "Stopping $DESC" $NAME 
     rm -f $SOCKET_FILE 
     if start-stop-daemon --stop --retry TERM/10/KILL/5 --quiet --pidfile $PIDFILE --exec $DAEMON --remove-pidfile 
     then 
      log_daemon_msg "$DESC" "$NAME stopped" 
      log_end_msg 0 
     else 
      log_end_msg 1 
     fi 
     ;; 
    reload|force-reload) 
     log_daemon_msg "Reloading $DESC" $NAME 
     rm -f $SOCKET_FILE 
     if start-stop-daemon --stop --signal HUP --quiet --pidfile $PIDFILE --exec $DAEMON 
     then 
      grant_socket_access 
      log_end_msg $? 
     else 
      log_end_msg 1 
     fi 
     ;; 
    restart) 
     log_daemon_msg "Restarting $DESC" $NAME 
     $0 stop 
     $0 start 
     ;; 
    status) 
     status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $? 
     ;; 
    *) 
     echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload|status}" >&2 
     exit 1 
     ;; 
esac 

exit 0 

編集

は親切に@マークStosbergが提供するレシピに続いて、私はに私の元の最初のバージョンを変更しました今のところ/bin/chown/bin/rmがあります。

新しいバージョンのExecStopPost=/bin/rm -f /tmp/my_prog.sock行から希望の結果が得られます。しかし、ExecStart=/bin/chown www-data:www-data /tmp/my_prog.sock出力する。このエラーは:

chown[8388]: /bin/chown: connot access '/tmp/my_prog.socket' 

答えて

0

あなたsystemd-analyze verify ./your-file.serviceを通して、あなたのスクリプトを実行すると、問題が明らかになった:man systemd.service

[/home/mark/tmp/t.service:7] Executable path is not absolute, ignoring: chmod www-data:www-data /tmp/my_prog.sock         
[/home/mark/tmp/t.service:8] Executable path is not absolute, ignoring: rm -f /tmp/my_prog.sock 

マニュアルを参照して、実行可能パスは絶対的でなければならないという要件について説明します。


あなたのエラーが.socket拡張子を持つファイルを参照していますが、あなたの例では、.sock拡張子を示しています。どこでも一貫して.sockまたは.socketを使用していることを確認してください。あなたのサービスをrootとして実行する必要がない場合


、あなたはセキュリティを向上させることができ、別のユーザーとしてサービスを実行するためにUser=Group=ディレクティブを使用することにより、chownに必要性を避けます。これにより、rootではなくそのユーザーが所有するソケットが作成されます。

+0

ありがとうございます!絶対実行可能パスは私の2番目の問題を解決します。私の最初の問題は残っています。 –

+0

更新された回答を参照してください。 –

+1

'.socket'は、編集中の誤字です。 'User ='と 'Group ='私の問題を解決し、それは最もエレガントなデザインだと思います。どうもありがとう! –

関連する問題