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 absolute과spark.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.