OpenSuse 12.1의 inittab에 프로젝트 추가

OpenSuse 12.1의 inittab에 프로젝트 추가

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 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 "$@"

관련 정보