OpenSuse 12.1의 inittab에 항목 추가

OpenSuse 12.1의 inittab에 항목 추가

inittab저는 현재 시작 중에 프로그램이 로드되도록 추가해야 하는 프로젝트를 작업 중입니다 .

제가 시작하려는 프로그램은 ac# 모노 애플리케이션입니다. 시작 스크립트를 만들었고 시작 스크립트를 수동으로 실행하면 프로그램이 제대로 시작됩니다. 그러나 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/skeleton.

원하는 런레벨을 나타내도록 이 파일을 수정하십시오. 예에서는 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

이와 동일한 작업을 수행하는 배포판별 방법이 있습니다. 예를 들어 데비안은 다음을 사용합니다.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 qinit에게 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 "$@"

관련 정보