Node-REDでConnManを再起動したいです。サービスは独自のユーザーによって実行されますnodered
。
ユーザーとしてデバイスにSSHを入力しnodered
て入力すると、
nodered@pi:~$ sudo /etc/init.d/connman restart
これはうまくいきます。
ただし、電話をかけてvisudo
次の行を追加すると、次のようになります。
nodered ALL = (root) NOPASSWD: /etc/init.d/connman restart
コマンドを実行すると、次のエラーが発生します。
nodered@pi:~$ /etc/init.d/connman restart
Restarting Connection Manager
/etc/init.d/connman: line 47: kill: (28874) - Operation not permitted
失敗した行は次/etc/init.d/connman
のとおりです。
do_stop() {
# kill the script monitoring execution
if [ "X${pid=$(pidof -x /usr/sbin/connmand-watch.sh)}" != "X" ]; then
kill $pid
答え1
サービスとその監視者の両方がユーザーとして実行されていて、nodered
同じユーザーとしてログインしている場合は、sudo
まったくそうする必要はありません。プロセス所有者には、kill -9
必要に応じて常にそのプロセスを終了する権利があります。
このsudoers
行は:
nodered ALL = (root) NOPASSWD: /etc/init.d/connman restart
nodered
ユーザーに root でコマンドを実行する権限を与えます/etc/init.d/connman restart
。スクリプトまたはサービス自体がサービスとウォッチャーの両方がユーザーとして開始されていることを確認できない場合、スクリプトを実行するnodered
と、サービスおよび/またはスクリプトがルート所有プロセスで再起動されることを意図しないsudo
副作用が発生する可能性があります。connmand-watch.sh
注意してください。
を使用すると、kill -0
実際にシグナルを送信せずにプロセスを終了できるかどうかをテストできます。スクリプトの冒頭で次のことができます/etc/init.d/connman
。
if [ $(whoami) != "root" ]; then
watcherpid=$(pidof -x /usr/sbin/connmand-watch.sh)
if [ "" != "$watcherpid" ] && ! kill -0 "$watcherpid" 2>/dev/null; then
# Watcher exists but cannot be signaled so it runs as some other user.
# Attempt to re-execute this script with root powers.
exec sudo /etc/init.d/connman "$@"
# If we reach this line, we could not exec sudo. That's bad.
exit 1
fi
fi
を使用すると、exec sudo /etc/init.d/connman "$@"
スクリプトはsudoを介して再実行されます。その後exec
、スクリプトの権限のない通常のコピーの実行はすぐに終了し、sudo
edバージョンはそれを元の呼び出しと同じコマンドライン引数に置き換えます。
ウォッチャープロセスが見つからない場合、またはスクリプトがすでにrootとして実行されている場合、このテストは失敗し、アクションは必要ありません。
注:スクリプトがそれ自体で再実行しようとしてsudo
失敗しようとすると、スクリプトは何もせずに停止します。