우분투가 시작될 때 자동으로 서비스를 시작하는 방법은 무엇입니까?


31

Ubuntu 12.04를 사용하고 있으며 시스템이 정상적으로 부팅 될 때 서비스를 시작하려고합니다.

'service'로서 몇 가지 코드를 이해합니다 (예 : cd my_directory). my_command -host 0.0.0.0 -port 1234 -arg x 명령 행에서 시작된 것처럼 실행 중이어야합니다. 일반 사용자로 시작해야하는 서비스가 있지만 루트로 시작되는 서비스도 있습니다 (사실, 서비스를 사용자 수준에서 실행할 필요는 없습니다).

또한 '서비스'가 중지 될 때 동작을 구성해야합니다. 필자의 경우 지정된 디렉토리에서 동일한 인수로 다시 시작하기를 원합니다.

시스템이 정상적으로 시작될 때, 즉 전원 스위치를 누르면 모든 서비스가 자동으로 시작되어야합니다. 다른 조치는 필요하지 않습니다.

인터넷에 어떤 문서가 퍼져 있지만 모두 나를 혼란스럽게합니다. 그들은 이야기 init, init.d, rc.d,하지만 난 예를 들어 신출내기 사용하는 서비스로 쉽게로 간단하게 다음과 단계별 지침을 본적이 없어요. 이것이 쉬운 경우, 해당 단계가 여기에 제공되면 감사하겠습니다.

답변:


33

Ubuntu가 시작될 때 자동으로 시작되는 작업을 만들려면 여기에 제공된 예제를 사용 하십시오 . 작성된 예제 /etc/init/testservice.conf와 같이 sudo 를 사용하여 다음 파일을 작성한다고 가정하십시오 .

# testservice - test service job file

description "my service description"
author "Me <myself@i.com>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

프로세스 사용을 수동으로 시작 또는 중지하려면

sudo start testservice
sudo stop testservice

작업 제어 명령을 참조하십시오 .


서비스를 시작하려면 "startall 시작된 mountall"이 필요했습니다.
martinedwards

23

좋아, 알렉스, 요점은 리눅스의 모든 사용자 공간 프로세스가 시작된다는 것입니다 init실행, 그 PID 예를 들어 1입니다, 과정 pstree그 루트 init이 당신의 프로세스 트리를 볼 수 .. 여러 버전이 있습니다 init프로세스 구현은 요즘 가장 주목할만한 것은

  • sysVinit (클래식 init, 이전 데비안을 포함한 일부 배포판에서 여전히 사용)
  • 이전 Ubuntu와 일부 RHEL (Red Hat) 및 이전 Fedora 버전에서 사용되는 Upstart init
  • 현대 페도라, 우분투, 데비안, RHEL, SUSE 버전에서 사용되는 systemd init

일반적 으로 Unix sysVinithttps://ru.wikipedia.org/wiki/UNIX_System_V 버전의 Unix 라는 init 라는 init 구현을 사용했습니다 . 그것은 매우 영향력이 있으며 다른 inits는 이전 버전과 호환됩니다.

기본적으로 sysVinit는 먼저 /etc/inittab파일을 읽고 실행할 런레벨을 결정하고 /etc/init.d/rc스크립트에 소위 init 스크립트를 실행하도록 지시 합니다. 예를 들어, 보통 Ubuntu 에서 2 단계 인 다중 사용자 런레벨로 부팅하면에서 /etc/init.d/rc스크립트 실행이 시작됩니다 /etc/rc2.d. 파일은 스크립트에 대한 심볼릭 링크 만있는 반면 스크립트 자체는 /etc/init.d디렉토리에 저장됩니다 . /etc/rc*.d디렉토리 에서 해당 심볼릭 링크의 이름은 다음과 같습니다. 다음과 같은 스크립트가 있습니다 /etc/rc2.d.

$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager

그것은 2 개 init 프로세스를 실행 레벨로 전환시 첫 죽이는 것을 의미 network-manager와의 스크립트 이름이 시작 원인, 과정을 K- K02network-manager다음 이름이 시작하는 프로세스를 시작합니다 S. 두 자릿수 후 S또는 K순서를 결정 00에서 99까지 숫자입니다, 프로세스가 시작된다. 예는 rsyslog이전에 시작 apache2, 16 말이 미만 17 (때문에, 당신은 아파치 위해 rsyslog의 기록 용량에 의존 할 원인 rsyslog를 먼저 시작해야합니다). 스크립트는 일반 쉘 스크립트이며에 의해 실행됩니다 #!/bin/sh.

따라서 기본적으로 sysVinit 스타일로 시작할 때 프로그램을 시작하려면 자신의 스크립트를 작성하고 (예를 들어 복사하여 붙여 넣기 /etc/init.d) /etc/init.d적절한 이름으로 (예 : S99mytrojan에서 와 같이) 심볼릭 링크를 만듭니다 /etc/rc2.d. 다음은 /etc/init.d의 일반적인 sysVinit 스크립트에 대한 설명입니다. http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html

이제 우분투 사람들은 init에서 추가 기능을 원한다고 결정했습니다. 빠른 부팅 OS를 원했기 때문에 스크립트를 병렬로 실행하기를 원했습니다. 그들은 죽은 프로세스가 자동으로 다시 시작되기를 원했습니다. 그들은 프로세스가 이벤트에 의해 명시적인 방식으로 서로를 호출하기를 원했습니다 (따라서 아파치는 "syslog 시작"이벤트에 의해 실행되고 syslog는 "파일 시스템 마운트"이벤트에 의해 실행되기 때문에 00 대신 몇 가지 이벤트가 있습니다) -99). 따라서 그들은 Upstart를 만들었고 여기 에 그것이 작동하는 방법이 있습니다. Upstart initscript는 /etc/init디렉토리 에 넣습니다 (와 혼동하지 마십시오 /etc/init.d). 일반적으로 Upstart /etc/init.d/rc도 실행되므로 sysVinit 스크립트를 정상적으로 실행합니다. 그러나 종료시 스크립트를 다시 생성하려면 Upstart 이벤트가 적합합니다.

내 스크립트가 작동하는지 확인할 수는 없지만 목표를 위해 다음 /etc/init/mytrojan.conf스크립트를 작성해야한다고 가정합니다 .

start on runlevel [02]
respawn
exec mytrojan --argument X 

그러나 최소한 파일 시스템과 네트워크와 같은 종속성이 필요한 경우 start on runlevel [02]다음과 같은 것으로 대체 하는 것이 좋습니다 .

start on (local-filesystems and net-device-up IFACE!=lo)

경고 : 나는 이것의 정확성을 확인하지 못했습니다. 특히 네트워크 연결이 시작된 후 스크립트를 시작하는 방법을 잘 모르겠습니다 ( 이 버전을 사용 했습니다 ). "네트워크 시작시 시작"에 대한 인터넷 검색을 시도하십시오.


1
이것은 리눅스에서 시작된 프로세스의 역사에 대한 아주 좋은 개요이지만 질문에 의해 대답하지는 않습니다. 나는 여전히 시작 프로세스를 '만드는'방법을 모른다. 나는 또한 그것을 사용하고 싶습니다. 작동 방식에 대한 모든 작은 부분을 이해하지는 마십시오. 우분투의 upstart..l로 프로세스를 자동으로 시작하고 다시 생성하는 방법에 대한 간단하고 사용하기 쉬운 작업 예제를 원했습니다.
Alex

@Alex : 샘플 scipt로 업데이트되었습니다. 내 스크립트가 잘못되었을 수도 있습니다. 나는 alexreisner.com/code/upstart의 정신으로 그것을했습니다 .
보리스 Burkov

1
이것이 내가 읽은 최고의 답변 중 하나이기 때문에 공감되었습니다.
user1301428
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.