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

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

Ubuntu 12.04를 사용하고 있으며 시스템이 정상적으로 부팅되면 서비스를 시작하고 싶습니다.

"서비스"로서 나는 cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x 와 같은 일부 코드가 명령줄에서 시작된 것처럼 실행되어야 한다는 것을 이해합니다. 일반 사용자로 시작된 서비스와 루트로 시작된 서비스가 있습니다(실제로 서비스가 사용자 수준에서 실행되어야 한다는 요구 사항은 없습니다).

또한 "서비스"가 중지될 때의 동작을 구성해야 합니다. 내 경우에는 동일한 매개변수를 사용하여 지정된 디렉터리에서 다시 시작하기를 원합니다.

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

웹상에 떠도는 몇 가지 문서가 있지만 모두 나를 혼란스럽게 합니다. 그들은 ,,에 대해 이야기 init하지만, 예를 들어 upstart를 서비스로 쉽게 사용하기 위한 단계별 지침을 쉽게 따라할 수 있는 것을 본 적이 없습니다 init.d. rc.d이것이 쉬운 경우 여기에 단계가 제공되면 감사하겠습니다.

답변1

Ubuntu 부팅 시 자동으로 시작되는 작업을 생성하려면 제공된 예제를 사용하십시오.여기. 서면 예로, /etc/init/testservice.confsudo를 사용하여 다음 파일이 생성되었다고 가정합니다.

# testservice - test service job file

description "my service description"
author "Me <[email protected]>"

# 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

보다작업 제어 명령.

답변2

음, Alex, 요점은 Linux의 모든 사용자 공간 프로세스가 initpid 1을 사용하여 프로세스로 시작된다는 것입니다. 예를 들어 pstree루트가 init인 프로세스 트리를 보려면 실행합니다. init현재 여러 버전의 프로세스 구현이 있습니다. 특히 주목할 만한 것은

  • sysVinit (클래식 init, 이전 데비안을 포함한 일부 배포판에서 여전히 사용됨)
  • 이전 Ubuntu, 일부 RHEL(Red Hat) 및 이전 Fedora 버전에서 사용되는 Upstart init
  • 최신 Fedora, Ubuntu, Debian, RHEL, SUSE 버전에서 사용되는 systemd init

sysVinit전통적으로 Unix는 init라는 이름의 init 구현을 사용했습니다.https://ru.wikipedia.org/wiki/UNIX_System_V유닉스 버전. 이는 매우 영향력이 크며 다른 초기화도 이전 버전과 호환됩니다.

기본적으로 sysVinit는 먼저 /etc/inittab파일을 읽고 실행할 실행 레벨을 결정한 다음 /etc/init.d/rc스크립트에 init 스크립트를 실행하라고 지시합니다. 예를 들어, 다중 사용자 런레벨로 정상적으로 부팅되면 일반적으로우분투의 런레벨 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하는 프로세스를 종료 한 다음 이름이 - 로 시작하는 프로세스를 시작한다는 것을 의미합니다 . or 뒤의 두 자리 숫자 는 00부터 99까지의 숫자로, 프로세스가 시작되는 순서를 결정합니다. 예를 들어, 16이 17보다 작기 때문에 먼저 시작하십시오 (아파치가 로깅 기능을 위해 rsyslog에 의존하도록 하려는 것이므로 rsyslog를 먼저 시작해야 하기 때문에 이는 의미가 있습니다). 이 스크립트는 에서 만든 임시 쉘 스크립트입니다 .KK02network-managerSSKrsyslogapache2#!/bin/sh

따라서 기본적으로 sysVinit 스타일 부팅에서 프로그램을 시작하려면 자신만의 스크립트를 작성하고(이미 있는 예제에서 복사하여 붙여넣기 /etc/init.d) 이를 입력 하고 에서처럼 /etc/init.d합리적인 이름으로 심볼릭 링크를 만듭니다 . 다음은 /etc/init.d의 일반적인 sysVinit 스크립트에 대한 설명입니다.S99mytrojan/etc/rc2.dhttp://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html

이제 우분투 사람들은 init에 대한 추가 기능을 원하기로 결정했습니다. 그들은 빠른 부팅 OS를 원하므로 스크립트가 병렬로 실행되기를 원합니다. 그들은 프로세스가 이벤트를 통해 명시적으로 서로를 호출하기를 원합니다(그래서 아파치는 "syslog 시작" 이벤트에 의해 실행됩니다). syslog는 "파일 시스템 마운트" 이벤트 등에 의해 실행되므로 일부 숫자 00 -99 대신 이벤트가 있습니다. 그래서 그들은 Upstart를 만들었고여기그것이 작동하는 방식입니다. Upstart 초기화 스크립트는 /etc/init디렉터리에 배치됩니다( Upstart 와 혼동하지 마세요 /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)

경고: 정확성을 확인할 수 없기 때문에 확인하지 않았습니다. 특히, 네트워크 연결이 시작되어 실행된 후 스크립트를 시작하는 방법을 잘 모르겠습니다(저는이 버전). "웹에서 신생기업"을 검색해 보세요.

관련 정보