同じシェルスクリプトの新しいインスタンスに対して新しいプロセスを作成する方法は?

同じシェルスクリプトの新しいインスタンスに対して新しいプロセスを作成する方法は?

lockコマンドを使用してファイルをロックしようとしています。構文は次のとおりです。

./lock </path/to/file/name>

特定のディレクトリにある複数のファイルをロックする必要があります。これには2つのスクリプトを使用します。

  1. parent.sh
  2. child.sh

parent.shchild.sh各ファイルに対して 1 つのプロセスが呼び出されます。したがって、9つのファイルをロックする必要がある場合は、parent.sh9つのファイルを作成する必要がありますchild.shが、残念ながらそのようなことは起こりませんでした。

[root@localhost /]# cat parent.sh
#!/bin/ksh
for f in /vol4/commit/file[1-9]
do
 sh /child.sh & $f
done

[root@localhost /]# cat child.sh
#!/bin/ksh
./lock $1

実行すると、sh parent.sh次のエラーが発生します。

[root@localhost /]# sh parent.sh
parent.sh: line 4: /vol4/commit/file1: Permission denied
parent.sh: line 4: /vol4/commit/file2: Permission denied
parent.sh: line 4: /vol4/commit/file3: Permission denied
parent.sh: line 4: /vol4/commit/file4: Permission denied
parent.sh: line 4: /vol4/commit/file5: Permission denied
parent.sh: line 4: /vol4/commit/file6: Permission denied
parent.sh: line 4: /vol4/commit/file7: Permission denied
parent.sh: line 4: /vol4/commit/file8: Permission denied
parent.sh: line 4: /vol4/commit/file9: Permission denied

私はrootとして実行しているので、ここに権限の問題があるとは思わなかったが、私が見たのはそうです。

答え1

4行parent.shsh /child.sh & $f。 &記号は、以下のようにコマンドの末尾に配置する必要がありますsh /child.sh $f &

あなたの場合、sh /child.shバックグラウンドで実行してからフォアグラウンドで実行しようとすると、ファイルが実行可能ではないと仮定できるため、$f権限が拒否されます。/vol4/commit/file[1-9]

また、ファイルが読み取り専用の場合、ルートに対しても編集したり、書き込みロックを取得できないことに注意してください。

関連情報