プログラム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
:
は、私はそれがあまりにも早くコマンド
chmod
とrm
が実行されつつあることは私に、このような予期せぬ結果をもたらすと思います終了します(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'
ありがとうございます!絶対実行可能パスは私の2番目の問題を解決します。私の最初の問題は残っています。 –
更新された回答を参照してください。 –
'.socket'は、編集中の誤字です。 'User ='と 'Group ='私の問題を解決し、それは最もエレガントなデザインだと思います。どうもありがとう! –