systemd를 사용하여 시작할 때 단일 명령을 어떻게 실행합니까?


113

부팅 후 다음 명령을 사용하여 Apache Spark 클러스터를 시작하고 싶습니다.

sudo ./path/to/spark/sbin/start-all.sh

그런 다음 시스템이 재부팅 / 종료 준비를 할 때이 명령을 실행하십시오.

sudo ./path/to/spark/sbin/stop-all.sh

어떻게 시작할 수 있습니까? 빌드 할 수있는 기본 템플릿이 있습니까?

나는 매우 간단한 (파일 :)을 사용하려고했습니다 /lib/systemd/system/spark.service.

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh

작동하지 않습니다.



@WillemK 님, 안녕하세요. 이미이 페이지를 보았습니다. 내가 찾은이 문제는로 바꿀 수 없다는 것 exec입니다 ExecStart=. 또한, 나는 이전에 가동을 사용하지 않았습니다.
macourtney7

1
스크립트 경로 앞의 점은 매우 의심스럽게 보입니다.
Andrea Lazzarotto

@AndreaLazzarotto 나는 OP는 것 터미널에 따라서 스크립트에게 방법의 영업 이익을 실행하려고 생각 ....
조지 Udosen

안녕하세요 @AndreaLazzarotto, 이것이 맞습니다. 혼란에 대한 사과.
macourtney7

답변:


142

귀하의 .service파일은 다음과 같아야합니다 :

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

이제 .service파일 을 활성화하고 사용하는 몇 가지 단계를 더 수행하십시오 .

  1. /lib/systemd/system이름을 말하는 폴더에 넣으십시오.myfirst.service

  2. 다음을 사용하여 스크립트를 실행 가능하게 만드십시오.

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. 시작하십시오 :

    sudo systemctl start myfirst
    
  4. 부팅시 실행되도록 설정하십시오.

    sudo systemctl enable myfirst
    
  5. 멈춰:

    sudo systemctl stop myfirst
    

노트:

  1. 기본 서비스 사용자는 이미 루트이므로 서비스에서 sudo를 사용하여 Spark를 시작할 필요가 없습니다.

  2. 더 많은 systemd옵션은 아래 링크를 참조하십시오 .

최신 정보

이제 우리가 가진 것은 초보적인 것입니다. 여기 스파크를위한 완전한 설정이 있습니다 :

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

서비스를 설정하려면

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service

추가 자료

다음 링크를 읽으십시오. Spark는 복잡한 설정이므로 Ubuntu의 init 서비스와 어떻게 통합되는지 이해해야합니다.

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7/

https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html


저명한 업데이트
조지 Udosen을

1
이것에 감사드립니다, 나는 당신이 제안한 것을 기반으로 파일을 만들었습니다. 실행시 sudo systemctl start spark다음 오류가 발생합니다.Failed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
macourtney7

의 주요 부분은 systemctl status spark.service다음과 같습니다 Executable path is not absolutespark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7

문제는 1) Spark 바이너리 경로 (서비스 파일에있는 것을 대체해야 함)가 필요합니다. 2) Spark에는 종료 명령이 있습니다. 3) 내가 준 링크를 살펴 보았습니까? 나는 스파크를 사용하지 않으므로 공급하십시오
George Udosen

? 당신의 대답에 대한 @GeorgeUdosen 덕분에, 내 질문에 내가 질문은 여기에 재부팅 한 후 특정 명령에 따라 불꽃을 실행할 수있는 방법입니다 askubuntu.com/questions/979498/...
Soheil Pourbafrani

2

/root/boot.sh최소 서비스 파일을 사용하여 부팅시 (루트로) 생성 및 실행 됩니다.

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

루트 터미널에 Ctrl+를 넣을 수 있습니다 C.

예를 들어 다른를 사용하도록 매개 변수를 수정하려면 $bootscript해당 변수를 수동으로 설정하고 명령을 복사 할 때 해당 행을 건너 뛰십시오.

명령을 실행 한 후 자주 사용하는 편집기를 사용하여 부팅 스크립트를 편집 할 수 있으며 다음 부팅시 실행됩니다. 다음을 사용하여 즉시 실행할 수도 있습니다.

systemctl start $servicename

모든 단계는 sudo로 수행 할 수 있지만 약간 더 복잡하며 일부 시스템에는 sudo가 설치되어 있지 않으므로 일부 사람들은 사용하기 전에 예제를 수정해야합니다. 따라서 예제에 sudo를 포함하지 않기로 선택했습니다.


나는 시스템 문서에 약간 혼란 스럽지만 Type=oneshot RemainAfterExit=yes사용자 정의 스크립트가 일부 프로세스를 실행하지 않는 한 시스템이 작업을 비활성으로 간주 해서는 안됩니다 .
피터 램 버거

@ PetetLamberg systemd 문서도 읽으려고했지만 여기에 우리 모두가 있습니다;). 나는 그들이 명확하지 않다는 것을 기억하지만, 내가 게시 한 답변은 여러 시스템에서 효과적입니다 (이 페이지를 매번 다시 방문하고 다시 필요할 때마다 다시 방문하십시오). '비활성'으로 간주되므로 모든 '시작'호출이 스크립트를 다시 실행한다는 의미입니까? 쉘 스크립트에서 예상 한대로 고려하기 때문입니다. 다시 시작하기 전에 실제로 실행되지 않는 무언가를 '중지'해야한다면 이상하게 느껴질 것입니다.
Luc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.