検索しにくい質問です!
次のシェルスクリプトがあります。
#!/bin/bash
./script.fcgi --socket /tmp/fcgi-socket &
sleep 2
chmod a+w /tmp/fcgi-socket
script.fcgiは長期実行プログラム(デーモン?)なので、バックグラウンドで実行するには&を追加する必要があります。疲れているという事実に加えて、睡眠が必要です。そうしないと、スクリプトがchmodを実行する前にソケットを設定する時間がないためです。
私は次のような行が欲しい:
./script.fcgi --socket /tmp/fcgi-socket & && chmod a+w /tmp/fcgi-socket
しかし、これは不可能だと思います。そして、正しい書き込み権限でソケットを設定するスクリプトを取得する方法がわかりません。 (これはもう一つの質問になるでしょう。)しかし疑問に思います。 &と&&の組み合わせについて私が何かを見逃しているのでしょうか、それとも私が望むことを実際にすることはできませんか?
答え1
あなたが望むものを理解し、プロセスがフォークする傾向がないと仮定すると、次のようになります。
/long/running/process with args &
LRP_PID=$!
sleep 2
if jobs %% #It's alive!
then
chmod a+w ...
fi
(またはkill -0 $LRP_PID
代わりにjobs 1
.)
答え2
はい、もちろんです。構文は次のとおりです。
(/absolute/path/to/script/script.fcgi --socket /tmp/fcgi-socket &) && (sleep 2; chmod a+w /tmp/fcgi-socket)
しかし、Mikelのコメントを覚えておいてください。そうですね。
編集する:
以下の@muruのコメントを考慮して説明します。 OPは、最初のコマンドが正常に完了した後に2番目と3番目のコマンドを実行したくありません。彼はこれが長期実行コマンドであると明示的に述べています。 OPは成功後に3番目のコマンドを実行しようとします。スタート最初のコマンド。上記のコード行はまさにそれをします。
編集2:
@muruのプロンプトに応じて、次のコード行は、初期コマンドの開始時にエラーを確認します。
(/absolute/path/to/script/script.fcgi --socket /tmp/fcgi-socket 2> /path/to/errors.txt &) && (sleep 2; if ! [ -s /path/to/errors.txt]; then chmod a+w /tmp/fcgi-socket; fi)
答え3
端末を終了したくない場合は、以下を実行できます。
./script.fcgi --socket /tmp/fcgi-socket && chmod a+w /tmp/fcgi-socket &
ログアウトする場合、または同じ端末マルチプレクサでスクリプトを起動するのが最善screen
ですtmux
。
私はそれに慣れていませんが、tmux
次のものを使用できますscreen
。
コマンドを使って画面を起動しますscreen
。新しい「画面」シェルで次を実行します。
./script.fcgi --socket /tmp/fcgi-socket && chmod a+w /tmp/fcgi-socket
勝つenter
ctrl + a
押してから押すと画面から切り離されます。ctrl + d
戻ると、次のように画面に再接続できます。
screen -r
画面外でこのスクリプトを実行すると、バックグラウンドでスクリプトが実行されます。画面に再接続すると、そのシェルに再接続できます。
答え4
私の考えでは、多くの人が考えをあまりにも多くしているようです。言うほど
./script.fcgi --socket /tmp/fcgi-socket & sleep 2; chmod a+w /tmp/fcgi-socket
なぜなら、構文的にと&
同様に動作します;
。 (はい、もちろんそうです。意味的にその他。 )