/etc/init.d/myfileにサービスとしてスクリプトをロードしました。
サービスを開始しようとするとエラーが発生します。
/etc/init.d/myservice: 21: /etc/init.d/myservice: Syntax error: "(" unexpected
問題は、ソースコマンドのプロセス置換<(に関連しているようです。他のスクリプトでこれを使用して問題なくデフォルトの構成ファイルから変数を抽出しましたが、ケースステートメントではどのように作成するのかわかりません。うまくいきます)。
私のサービスには以下が含まれます。
#!/bin/sh
#/etc/init.d/myservice
### BEGIN INIT INFO
# Provides: myservice
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: my service
# Description: Start the myservice service
### END INIT INFO
case "$1" in
start)
# start processes
# Import the following variables from config.conf: cfgfile, dir, bindir
source <(grep myservice /opt/mysoftware/config.conf | grep -oP '.*(?= #)')
if [ -f $cfgfile ]
then
echo "Starting myservice"
/usr/bin/screen -U -d -m $bindir/myscript.sh $cfgfile
else
echo "myservice could not start because the file $cfgfile is missing"
fi
;;
stop)
# kill processes
echo "Stopping myservice"
screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
;;
restart)
# kill and restart processes
/etc/init.d/myservice stop
/etc/init.d/myservice start
;;
*)
echo "Usage: /etc/init.d/myservice {start|stop|restart}"
exit 1
;;
esac
exit 0
config.confファイルは、簡単な説明とそれを使用するスクリプト名を含む変数宣言のリストです。私は与えられたスクリプトに必要な変数だけを得るためにgrepフィルタを使います。
次のようになります。
var1=value # path to tmp folder myservice
var2=value # log file name myservice script1.sh script2.sh
var3=value # prefix for log file script1.sh script2.sh
注:ハードコードされた値の代わりに構成ファイルを使用して開始するように変換するまで、サービスは正常に機能していました。
ありがとうございます。
答え1
Bash、ksh93、zsh、およびその他の最近のシェルはプロセス置換(<(command)
構文)をサポートしますが、これは非標準拡張です。 Dash(/bin/sh
Ubuntuシステム)はこれをサポートしておらず、/bin/sh
bashからの呼び出しでもサポートされていません。
bashが利用可能な場合は、スクリプトの最初の行を例えば#!/bin/bash
。
[ファイルシステムをマウントできるディレクトリにbashを含むシステム(たとえば、/usr/local/bin
一部のシステム)では、サービスを開始する前にファイルシステムが利用可能であることを確認する必要があります。 ]
答え2
プロセスの置き換えはバシズムしかし、あなたのシェルボーンラインはい#!/bin/sh
。この構文は、/bin/sh
Bashまたは他のシェルがプロセス置換をサポートしていない限り、実際にはサポートされていません。ツイートをサイトに埋め込む。