검색하기 어려운 질문입니다!
다음과 같은 쉘 스크립트가 있습니다.
#!/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는 첫 번째 명령을 성공적으로 완료한 후 두 번째 및 세 번째 명령을 실행하는 것을 원하지 않습니다. 그는 이것이 장기 실행 명령이라고 명시적으로 명시합니다. OP는 성공 후 세 번째 명령을 실행하려고 합니다.시작첫 번째 명령. 위의 코드 줄이 바로 그 일을 합니다.
편집 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
왜냐하면,구문론적으로는 &
와 유사하게 동작합니다 ;
. (예, 물론 그렇습니다.의미적으로다른. )