쉘 프롬프트를 표시하려면 init.d 스크립트가 완료된 후 Enter를 눌러야 하는 이유는 무엇입니까?

쉘 프롬프트를 표시하려면 init.d 스크립트가 완료된 후 Enter를 눌러야 하는 이유는 무엇입니까?

나만의 CentOS init.d 스크립트를 작성해야 했습니다.셀러리데비안에는 하나만 제공하기 때문입니다. 내 스택 오버플로 질문에 대한 답변으로 내가 작성한 스크립트를 볼 수 있습니다.3989656.

하지만 이 스크립트에는 문제가 있습니다. 내가 전화하면 :

sudo service celeryd start

그런 다음 완료되면 Enter 키를 눌러 쉘 프롬프트를 표시해야 합니다. 이것은 SSH를 통해 다른 컴퓨터에서 다음과 같이 호출하려고 하기 때문에 문제가 됩니다.

ssh 192.168.2.3 sudo service celeryd start

그리고 ssh는 결코 반환되지 않습니다. (나는 사용한다구조위의 ssh 명령을 호출하기 때문에 원격 서비스를 시작하고 중지합니다.

이 동작의 원인은 무엇이며 스크립트에서 이를 수정하는 방법은 무엇입니까?

Thomas Themel이 주석에서 제안한 대로 "sh -x /etc/init.d/celeryd"를 수행하면 출력은 다음과 같습니다.

runuser -s /bin/bash - apache -c 'ulimit -S -c 0 >/dev/null 2>&1 ; /usr/local/django/portalapps/manage.py celeryd --pidfile /var/run/celery.pid -f /var/log/celeryd.log -l INFO'

/etc/init.d/functions(이 일련의 bash 명령을 생성한 기능)의 데몬 기능이 실제로 프로세스를 데몬화하는 방법을 이해하지 못합니다.

답변1

실제로 쉘 프롬프트가 표시되지만 이를 인식하지 못할 수도 있습니다. 백그라운드에서 터미널에 쓰는 프로그램이 있는 경우 프롬프트는 가려지지만 여전히 입력할 수 있습니다.

테스트.sh:

#! /bin/sh
echo -e "This is a test\n\n"

대화형 셸:

$sh test.sh &
$This is a test



_

이 예에는 힌트가 있습니다. "This is a test"라는 프롬프트 앞에 "$"가 표시됩니다. 하단에는 입력을 기다리는 커서가 보입니다. 여기에 명령을 입력하고 Enter를 누르면 평소대로 작동합니다. ls데몬을 시작한 후 를 누르기 전에 실행 해 보세요 <enter>.

답변2

먼저 (필요에 따라 sudo)를 사용하여 /etc/init.d 스크립트를 직접 실행하여 해당 반환을 먹는 것이 무엇인지 파악하고 싶을 수도 있습니다 sh -x /etc/init.d/celeryd start. 쉘 스크립트에 있다면 다음과 같이 보일 것입니다. 반환하기 전에 자체적으로 개행 문자를 기다리는 경우 daemon답변은 셀러리드에만 해당되므로 이를 실행하거나 strace간단히 < /dev/null추가하여 터미널을 통해 표준 입력에 액세스할 수 없도록 하는 것이 좋습니다.

또 다른 "어둠 속에서의 실수" 시도: 터미널 할당 및 표준 입력을 비활성화하는 옵션을 ssh사용하여 실행합니다.-nt

답변3

똑같은 문제가 있었습니다. 귀하의 질문과 조사가 실제로 답을 찾는 데 도움이 되었습니다.

셀러리를 시작해 보세요 celery_detach. 그리고는 휙! 모든 것이 작동합니다!

즉.manage.py celery_detach --params --settings=foo

적절한 개행 문자와 구조가 찾고 있는 내용을 즉시 반환합니다.

답변4

명령 이 끝에 있어야 하는지 daemon여부입니다 . &나는 그렇게 생각하지 않습니다. 이것이 문제의 원인일 수 있습니다.

관련 정보