inittab
저는 현재 시작 중에 프로그램이 로드되도록 추가해야 하는 프로젝트를 작업 중입니다 .
제가 시작하려고 하는 프로그램은 C# 모노 애플리케이션입니다. 시작 스크립트를 만들었고 시작 스크립트를 수동으로 실행하면 프로그램이 정상적으로 시작됩니다. 그런데 inittab
프로그램 에 넣어보니 프로그램이 시작되지 않네요.
확인해 보니 /var/log/messages
아무 문제도 없고 그냥 재부팅만 되네요.
내가 스크립트에 추가한 inittab
내용은 다음과 같습니다.
bes:2345:respawn:/home/bits/MyProgram/start.myprogram
당신이 제공할 수 있는 도움에 감사드립니다
고쳐 쓰다 다음은 /home/bits/MyProgram에 있는 시작 스크립트의 코드입니다.
#!/bin/sh
cd /home/bits/MyProgram
/usr/bin/mono EmailServer.exe "$@"
또한 /usr/bin/mono로 시작하는 줄 끝에 > mylog.txt를 추가해 보았습니다. 예:
/usr/bin/mono EmailServer.exe "$@" > mylog.txt
시작 스크립트를 수동으로 실행하면 시작 스크립트가 있는 디렉토리에 없어도 잘 작동합니다. 다만 inittab에 추가하고 telinit q를 실행하면 시작되지 않고 로그도 기록되지 않습니다. 하지만 프로그램을 수동으로 시작하면 로그가 기록됩니다.
당신이 제공할 수 있는 도움에 감사드립니다.
답변1
프로그램을 어딘가에 두십시오.
다음 위치에 있는 초기화 작업 제어 프레임워크 템플릿 파일을 복사하고 편집합니다./etc/init.d/bones.
원하는 런레벨을 나타내도록 이 파일을 수정하세요. 예를 들어 2,3,4,5를 원하면 파일 상단(주석)에 원하는 런레벨을 나타내는 옵션이 있습니다.
이 새 파일을/etc/init.d설명적인 이름을 사용하세요. (내 이름예제에 사용됨)
이를 테스트하거나 활성화/비활성화하는 플랫폼 독립적인 방법(사용하는 경우)해골문서)
sudo /etc/init.d/myfancyname start
sudo /etc/init.d/myfancyname stop
sudo /etc/init.d/myfancyname restart
이러한 동일한 작업을 수행하는 배포판별 방법이 있습니다. 예를 들어 Debian은 다음을 사용합니다.update-rc.d myfancyname [시작|중지|활성화|비활성화...]
inittab을 다음으로 수정하세요.일반적으로 말하면ㅏ나쁜생각해보면, 이것을 망치면 시스템이 더 이상 부팅되지 않고 두 가지 문제가 발생하게 됩니다. (정규식이 필요하지 않습니다!)
/etc/init.d/ 하위 디렉토리에 스크립트를 추가하는 것은 더욱 표준화되었으며 거의 모든 종류의 Linux(*nix, 일부 bsd 등)에서 사용할 수 있습니다.
답변2
문제는 간단합니다. OpenSuse 12.1을 사용하고 있습니다.사용 체계너의 클래식 대신에시스템 V 부팅 시스템.
새 서비스 위치를 설치하려면 /etc/systemd/system/myprogname.service에 다음 파일을 생성하십시오.
[Unit]
Description=My progname service file
[Service]
ExecStart=/home/bits/MyProgram
[Install]
WantedBy=multi-user.target
그런 다음 실행 systemctl daemon-reload
하고systemctl start myprogname.service
MyProgname을 자동으로 다시 시작하려면 다음을 추가해야 합니다.
Restart=restart-always
서비스 섹션으로 이동합니다.
답변3
telinit q
init에게 reload를 지시하려면 실행해야 /etc/inittab
하지만 자동으로 수행되지는 않습니다. Re-reading inittab
나는 당신이 시스템 로그의 메시지를 언급한 이후로 이 작업을 수행했다고 가정합니다 (이 메시지를 본 적이 있습니까?).
프로세스가 전혀 시작되지 않는 것이 문제입니까, 아니면 시작하는 동안 프로그램이 실패하는 것입니까? 오류를 로그 파일로 리디렉션하는 래퍼 스크립트를 작성합니다.
#!/bin/sh
exec >/var/log/myprogram.log 2>&1
exec /home/bits/MyProgram/start.myprogram
로그 파일이 생성되었는지, 오류가 나타나는지 확인하세요.
염두에 두어야 할 한 가지는 프로그램이 세션에서 환경 변수를 설정해야 할 수도 있다는 것입니다. 이 init
프로세스의 맥락은 매우 제한적입니다. 필요한 경우 래퍼 스크립트를 수정하여 필요한 모든 변수를 설정합니다.
답변4
init
읽을 때주문하다실행되면 inittab
쉘을 포크하고 전송합니다.주문하다exec
이 셸의 명령에 대한 인수로 사용됩니다. 따라서 수동으로 수행하면 어떻게 되는지 확인하십시오.
sh -c exec /home/bits/MyProgram/start.myprogram
제가 시도하고 싶은 또 다른 방법은 런처 스크립트를 완전히 우회하고 inittab에서 다음과 같은 것을 사용하는 것입니다:
bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"