Linux에서 수동으로 시작하면 제대로 실행되는 프로그램(미리 컴파일된 바이너리)이 있습니다. 명령을 입력하는 데 사용하는 CLI가 있습니다. 이 프로그램은 소프트웨어 라우터이며 CLI에 연결하여 설정을 조정할 수 있습니다.
그러나 부팅 시 시작하려고 하면 프로그램이 너무 느리게 실행되어 사용할 수 없습니다. 예를 들어, 화면에 인쇄되는 정보가 있으면 전송 속도가 느린 것처럼 덩어리로 인쇄됩니다. 내가 입력하는 모든 명령은 이와 같이 발생하며 정보가 매우 느리게 인쇄됩니다.
S99 등을 사용하여 init.d를 실행하는 대신 부팅 후 수동으로 실행하는 것과 어떤 차이가 있습니까? 프로세스를 중지하고 수동으로 다시 시작하면 제대로 작동합니다.
이 Python 스크립트는 init.d에서 호출됩니다.
import subprocess
application_pidfile = "/var/run/application.pid"
command_line=["start-stop-daemon", "-q", "-p", application_pidfile, "-S",
"-m", "-b", "-x", "/bin/application"]
subprocess.call(command_line)
부팅한 지 한 시간이 지나도 여전히 느린 이유가 무엇인지 궁금합니다. 그런데 그냥 중지하고 수동으로 시작하면 시작하고 몇 초 뒤에도 제대로 실행되나요? 부팅 후 몇 분 후에 이 프로세스를 시작하는 등 지연을 설정해도 동일한 문제가 발생합니다.
느린 "소켓" 모드 등에서 시작됩니까?
답변1
최신 init 시스템(예: systemd 및 upstart)은 여러 실행 스레드를 실행하며 원시 init를 사용하더라도 부팅 중에 작업이 분기될 수 있습니다(시스템에서 말했듯이).
이는 프로세스가 다른 프로세스와 동시에 실행되고 모든 출력이 해당 출력과 인터리브됨을 의미합니다.
Process 1 says "I'm here"
Process 2 says "I'm here"
Process 1 says "Doing my thing..."
Process 3 says "I'm here"
Process 3 says "Doing my thing..."
Process 1 says "Still busy..."
Process 2 says "Doing my thing..."
여기의 순서는 시작 우선순위를 넘어서 무작위로 지정 S05
됩니다시작그러나 한 S70
프로세스의 완료가 다른 프로세스의 특정 전제 조건이 아닌 이상 서로 상대적으로 완료되는 시점은 불확실합니다.
스레드 프로그래밍을 해본 적이 있다면 이 경마에 익숙할 것입니다. 프로세스는 동시에 실행되기 때문에 순서대로 인터리브되지 않습니다. 따라서 제 예에서는 Process 3
이전에 시작된 프로세스가 동일한 작업을 수행하기 전에 여러 작업을 수행해야 합니다. 등. 그것은 단지 우연일 뿐, 매번 같은 것은 아닙니다.
부팅은 시스템이 바쁜 시간입니다- 동시에 많은 일들이 활발하게 일어나고 있습니다. 따라서 실행 시간을 나중에 프로세스 자체를 실행하는 것과 비교하면 후자의 경우 많은(또는 더 중요하게는 모든) 다른 활성 프로세스와 경쟁할 필요가 없기 때문에 속도가 느려집니다.