`systemctl start;를 실행할 때 종료 상태가 다른 이유는 무엇입니까? systemctl is-active`와 `systemctl is-active`는 다른가요?

`systemctl start;를 실행할 때 종료 상태가 다른 이유는 무엇입니까? systemctl is-active`와 `systemctl is-active`는 다른가요?

다음 시퀀스는 예상했던 두 번째 명령의 반환 값 대신 첫 번째 명령의 반환 값을 제공합니다(하위 쉘에서 첫 번째 명령을 실행했는지 여부에 관계없이).

sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
(sudo systemctl start x); sudo systemctl is-active --quiet x; echo $?;

서비스가 x손상되어 시작할 수 없습니다. 따라서 서비스가 실행되고 있지 않습니다. 독립적으로 실행되는 다음 명령은 올바른 반환 값을 제공합니다 3.

sudo systemctl is-active --quiet x; echo $?;

0그렇다면 실행할 때 두 번째 명령( )의 반환 값 대신 첫 번째 명령( )의 반환 값을 얻는 이유는 무엇입니까 command; command; echo $??3echo $?

온라인 중 GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu). 두 줄로 나누면 작동한다는 것을 알고 있습니다.

sudo systemctl start x;
sudo systemctl is-active --quiet x; echo $?;

하지만 PHP 함수에 넣기 때문에 한 줄로 필요합니다 shell_exec(). 두 번 실행하면 shell_exec()명령을 한 줄에 입력하는 것과 동일한 결과가 나타납니다.

답변1

이런 문제에 직면했을 때 나는 셜록 홈즈의 진언을 따르고, 아무리 믿을 수 없는 일이라도 불가능을 제거하고 나면 무엇이 남을지 생각하는 경향이 있습니다. 물론 컴퓨터에는 불가능한 것이 없지만 애초에 무시할 수 있을 정도로 불가능한 것들도 있습니다. (이것은 원래 제목인 " command; command; echo $?——반환 값이 올바르지 않습니다. 왜?"보다 더 의미가 있습니다.)

이 경우, 만약

sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;

$?성공을 나타내는 0 으로 표시됩니다 systemctl is-active. 서비스 자체 systemctl is-active가 활성 상태가 아니라는 사실은 서비스와 명령을 입력하는 운영자 사이에 경쟁이 있음을 강력히 암시합니다. 기본적으로 서비스는 systemctl start완료, systemctl is-active실행 및 서비스가 활성 상태임을 발견할 만큼 충분하게 시작됩니다. 서비스가 실패하여 사람의 입력이 systemctl is-active발견되었습니다. 비활성 상태입니다.

systemctl start과 사이에 짧은 지연을 추가하면 systemctl is-active거짓 긍정을 방지할 수 있습니다.

답변2

Systemd는 0.1짧은 시간(몇 초) 동안 서비스를 시작한 후 서비스가 중단됩니다.

3원래대로 돌아가 십시오.

sudo systemctl start x; sleep 0.2; sudo systemctl is-active --quiet x; echo $?;

0.2몇 초 내에 반환되어서 0는 안 됩니다.

sudo systemctl start x; sleep 0.1; sudo systemctl is-active --quiet x; echo $?;

이렇게 하면 systemctl start x; ps -fA | grep -i x이 서비스도 보게 됩니다. 그 후 다시 실행 하면 ps사라집니다.

답변3

이 시도:

sudo systemctl start x && sudo systemctl is-active --quiet x; echo $?;

&&시스템은 이전 명령이 성공적으로 완료된 경우에만 명령을 순차적으로 실행하도록 강제됩니다.

관련 정보