시작할 때 쉘 스크립트를 실행하는 방법


366

온 아마존 S3 리눅스 인스턴스, 나는 두 개의 스크립트 호출이 start_my_app와 stop_my_app시작 및 정지하는 영원히 (다시 내 Node.js를 응용 프로그램을 실행하는). 이 스크립트를 사용하여 Node.js 애플리케이션을 수동으로 시작하고 중지합니다. 여태까지는 그런대로 잘됐다.

내 문제 : start_my_app시스템을 부팅 할 때마다 실행되도록 설정하고 싶습니다 . 나는 안에 파일을 추가해야하고 init.d그것을 올바른 디렉토리에 심볼릭 링크하는 방법을 알고 rc.d있지만 실제로 내가 넣은 파일 안에 무엇이 들어가야하는지 알 수 없다 init.d. 나는 그것이 한 줄이어야한다고 생각 start_my_app하지만, 그것은 나를 위해 일하지 않았다.


5
나는 이런 종류의 전문가는 아니지만 init.d솔루션 ( here )이 rc.local솔루션 보다 선호되어야 한다고 생각합니다 . 후자는 새로운 툴링이 이전 버전과 호환되기 때문에 여전히 사용할 수있는 오래된 툴링이기 때문입니다.
— erikbwork

pm2 my_app를 시작하십시오. pm2 시작; pm2 save github.com/Unitech/pm2
— Unitech

답변:


292

넣은 파일에서 /etc/init.d/다음을 사용하여 실행 파일을 설정해야합니다.

chmod +x /etc/init.d/start_my_app

@meetamit 덕분에 이것이 실행되지 않으면 /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

최신 데비안에서는 스크립트가 LSB를 준수해야하기 때문에 작동하지 않습니다 (최소한 시작, 중지, 다시 시작, 강제 재로드 및 상태). https : //wiki.debian .org / LSBInitScripts

참고로, 상대 경로 대신 스크립트의 절대 경로를 넣어야합니다. 예기치 않은 문제가 해결 될 수 있습니다.

/var/myscripts/start_my_app

그리고 그 파일 위에 추가하는 것을 잊지 마십시오 :

#!/bin/sh

6
나는 이것을했고 그것은 실행되지 않았다. /etc/init.d에 있기 때문에 자동으로 실행됩니까? 아니면 시스템이 시작될 때 실행되도록 일정을 설정해야합니까?
— 수륙 양용 비행기

4
@amphibient 충분하지 않습니다 ... 또한이 파일에 대한 심볼릭 링크를 생성해야합니다 ( ln명령 사용 )rc.d
— meetamit

23
내 루트의 etc 폴더에 rc.d 디렉토리가 없습니다. 리눅스가 시작하는 데 중요한 디렉토리가 아닌가? OS가 제대로 작동하지 않는 것 같습니다. 만들어야합니까? 나는 모든 방법 "rc5.d"을 "rc1.d"와 같은 비슷한 이름의 파일들을 볼
— OKGimmeMoney

3
내가 어떤하지 않은 /etc/rc.d폴더를하지만, 내가 가지고있는 /etc/rcX.d(즉 폴더를 /etc/rc0.d , /etc/rc1.d , /etc/rcS.d을 ), 또한 파일있다 /etc/rc.local에 . 필자 /etc/rc9.d는 기존 폴더와 같은 또는 하나의 사용자 정의 폴더에 심볼릭 링크를 만들어야한다고 생각합니다 ... (Ubuntu Server 14.04)
— F8ER

2
이 질문에 도움이되었습니다 : unix.stackexchange.com/questions/28679/…
— seth10

344

이것을 위해 crontab을 설정하십시오.

#crontab -e
@reboot  /home/user/test.sh

모든 시작 후 테스트 스크립트를 실행합니다.


4
이것은 나를 위해 일한 유일한 솔루션입니다. 감사합니다
— whoopididoo

20
이것은 최적의 솔루션입니다 @reboot sh $HOME/test.sh심지어 청소기의 crontab에
— user3667089는

4
@ user3667089 실제로 작동하지 않습니다. 터미널을 열고 "crontab -e"를 입력하면 "@reboot sh /home/user/test.sh"에 쓰지만 시작시 실행되지 않는 창이 나타납니다. 내가 어디에서 잘못하고 있습니까?
— MycrofD

1
@ user3667089 일반적인 기본 줄 '#이 파일을 ...로 편집하십시오'와 '@reboot sh /home/.../.sh'를 쓴 줄입니다. 또한 초기 "sh"없이 '@reboot /home/.../.sh'를 시도했지만 결과가 없습니다.
— MycrofD

3
@MycrofD 당신 crontab -l은 @reboot sh $HOME/test.sh그것이 실제로 설정되었음을 확인 표시해야합니다 .
— user3667089

124

간단한 접근 방식은 다음에 줄을 추가하는 것입니다 /etc/rc.local.

/PATH/TO/MY_APP &

또는 특수 사용자로 명령을 실행하려는 경우 :

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(후행 앰퍼샌드는 프로세스를 배경으로하며 rc.local이 계속 실행되도록합니다)

전체 init 스크립트를 원한다면, 데비안 배포판에는 템플릿 파일이 있습니다.

cp /etc/init.d/skeleton /etc/init.d/your_app

그것을 조금 적응 시키십시오.


2
감사! 이 접근법은 간단한 요구 사항을 감안할 때 가장 효과가 좋았습니다. 나는 사용자를 지정해야한다고 확신한다. 그렇지 않으면 수동으로 앱을 중지해야 할 때 (실행 stop_my_app하여 sudo) 아니오 와 함께해야 합니까? 또한 후행 앰퍼샌드 (?)의 기능이 정확히 무엇인지 궁금합니다.
— meetamit

3
사용자는 앱에 따라 다릅니다. 그러나 루트로 실행해야 할 필요가 없으면 피하십시오. &백그라운드에서 프로세스 실행
— Gilles Quenot

2
sputnick, 죄송하지만 @ erikb85가 지적한 것이기 때문에 Koren의 답변을 받아 들일만한 답변으로 표시해야합니다. 또한 원래의 질문은 일을하는 init.d방법을 요구했기 때문에 (귀하의 대답은 당시의 간단한 해결 방법이었습니다) . 이 게시물은 많은 의견과 투표를 얻으므로 정확하게 유지하는 것이 중요합니다.
— meetamit

4
후행 앰퍼샌드가 프로세스를 배경으로하고 rc.local이 계속 실행되도록하는 것은 언급되지 않은 것 같습니다.
— mchicago

감사합니다! 내가 봉사하려고하는 동안 지난 몇 시간 동안 벽에 머리를 부딪쳤다. 그러나 아무것도 효과가 없었다. 이것을 시도, 매력처럼 작동합니다!
— Marko Grešak

34

이것이 제가 Red Hat Linux 시스템 에서하는 방식 입니다.

/etc/init.d루트 및 실행 파일이 소유 한에 스크립트를 넣습니다 . 스크립트 상단에에 대한 지시문을 제공 할 수 있습니다 chkconfig. 예를 들어, 다음 스크립트는 Java 애플리케이션을 사용자 oracle로 시작하는 데 사용됩니다.

스크립트의 이름은 /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

이는 스크립트가 레벨 3, 4 및 5에서 실행되어야하며 시작 / 중지 우선 순위는 99 및 10입니다.

그런 다음 사용자 는 시작시 스크립트를 활성화 또는 비활성화하는 데 사용할 root수 있습니다 chkconfig.

chkconfig --list apex
chkconfig --add apex

그리고 당신은 사용할 수 있습니다 service start/stop apex.


그 동안 epel 저장소에서 사용할 수있는 supervisord ( supervisord.org ) 패키지를 실험했습니다 . 프로그램을 시작하고 모니터하여 실패시 다시 시작하는 데 사용할 수 있습니다.
— Saule

대신 입력하는 "chkconfig를 --add SERVICE_NAME"에서는 /etc/init.d/에 스크립트를 넣어 한 후 입력 할 수 있습니다 폴더 "에 chkconfig를 service_name은"
— 드라간 Radevic

22

다음을 cron사용하여 입력하십시오 sudo.

sudo crontab -e

시작할 때 실행할 명령 (이 경우 스크립트)을 추가하십시오.

@reboot sh /home/user/test.sh

저장:

ESC를 누른 다음 : x를 눌러 저장하고 종료하거나 ESC를 누른 다음 ZZ를 누르십시오 (shift + zz).

테스트 테스트 테스트 :

  1. cron없이 테스트 스크립트를 실행하여 실제로 작동하는지 확인하십시오.

  2. cron에 명령을 저장했는지 확인하십시오. sudo crontab -e

  3. 서버를 재부팅하여 모두 작동하는지 확인하십시오 sudo @reboot


나는 이것을 매우 좋아합니다. 감사! 추신. sudo현재 사용자를 사용하여 시작하는 동안 특정 명령을 실행하려는 경우 사용하지 마십시오 .
— danger89

이 정보는 어디에 저장되어 있습니까? 그렇지 않다 /tmp??
— Peter Mortensen

15

crontab에 줄을 추가하십시오.

파일이 실행 가능한지 확인하십시오.

chmod +x /path_to_you_file/your_file

crontab 파일을 편집하려면

crontab -e

추가해야 할 줄 :

@reboot  /path_to_you_file/your_file

간단합니다!


이것은 나를 위해 작동하지 않습니다, 내가 누락 된 것이 있습니까? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

이것은 CentOs 7에서 나를 위해 일했습니다. 문제가있는 사람들을 위해 쉘 스크립트를 만들고 실행 가능하게 만들고 (chmod + x file_name) 크론에서 쉘 스크립트를 호출하여 노드 path_to_file / index.js를 호출해야했습니다.
— SeanOlson

11

또 다른 옵션은 crontab에 @reboot 명령을 사용하는 것입니다.

모든 버전의 cron이이를 지원하는 것은 아니지만 인스턴스가 Amazon Linux AMI를 기반으로하는 경우 작동합니다.


6

넌 할 수있어 :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

그런 다음이 명령을 사용하십시오

update-rc.d start_my_app defaults 100

Cyberciti 에서이 페이지를 참조하십시오 .


1
yocto를 기반으로 한 예쁜 베어 본 설정이 있으며 이것이 스크립트를 작동시키는 유일한 방법이었습니다. 감사.
— 카탈린 Vasile

3

자신 만의 / init 실행 파일 만들기

이것은 당신이 원하는 것이 아니지만 재미 있습니다!

임의의 실행 파일, 심지어 쉘 스크립트 를 선택하고 명령 행 매개 변수를 사용하여 커널을 부팅하십시오.

init=/path/to/myinit

부팅이 끝날 무렵 Linux 커널은 주어진 경로에서 첫 번째 사용자 공간 실행 파일을 실행합니다.

몇몇 프로젝트는 시스템 init과 같은 주요 배포판에서 널리 사용되는 실행 파일을 제공 하며 대부분의 배포판에서는 일반 시스템 작동에 사용되는 많은 프로세스를 분기합니다.

그러나 /init시스템을 더 잘 이해하기 위해 최소한의 스크립트 만 실행하도록 납치 할 수 있습니다 .

최소한의 재현 가능한 설정은 다음과 같습니다. https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init


2

이 간단한 솔루션은 CentOS를 실행하는 Amazon Linux 인스턴스에서 효과적이었습니다. /etc/rc.d/rc.local파일을 편집 하고 명령을 거기에 넣으십시오. 이 파일에서는 다른 모든 init 스크립트 후에 실행된다고 언급되어 있습니다 . 따라서 그 점에주의하십시오. 이것이 파일이 현재 나를 찾는 방법입니다. 여기에 이미지 설명을 입력하십시오. 마지막 줄은 내 스크립트의 이름입니다.


1

실행하려는 모든 경우 가장 쉬운 방법은 간단한 스크립트 또는 다른 방법으로 시스템> 환경 설정을 사용하는 GUI가 있고 시작 응용 프로그램을 사용하는 것입니다.

원하는 스크립트로 이동하면됩니다. (스크립트 실행 가능)


3
이것은 실제로 시작시 실행되는 것이 아니라 로그인시 실행되며 이는 상당히 큰 차이입니다. 모든 시스템 (특히 서버는 아님)에 "시스템> 환경 설정"이 없으므로 특정 설정에 따라 다릅니다.
— jazzpi

'시작시 리눅스 실행'이라는 검색어가 내가 찾고있는이 대답으로 이끌었습니다. OP의 질문에 대답하지 않더라도 이것은 Linux와 같은 멍청한 놈을 도울 수 있으므로 공감할 가치가 있습니다. 나도 마음에 들지 않지만 실용주의입니다.
— thymaro


1

루 분투에서는 반대 상황을 처리해야했습니다. 부팅 후 Skype가 실행되기 시작 ~/.config/autostart/하고 파일 에서 찾았습니다 skypeforlinux.desktop. 파일 내용은 다음과 같습니다.

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

이 파일을 삭제하면 도움이되었습니다.


0
  • /etc/init.d/ 디렉토리에 스크립트를 추가하십시오
  • rc 실행 레벨을 업데이트하십시오. $ update-rc.d myScript.sh defaults NN여기서 NN은 실행 순서입니다. 예를 들어 99는 98과 100 이전에 실행된다는 의미입니다.

0

Python 3 마이크로 서비스 또는 쉘로 작업; Ubuntu Server 18.04 (Bionic Beaver) 또는 Ubuntu 19.10 (Eoan Ermine) 또는 Ubuntu 18.10 (Cosmic Cuttlefish )을 사용하여 항상 다음 단계를 수행하며 항상 작동했습니다 .

  1. 필자의 경우 p 예제 "brain_microservice1.service"라는 마이크로 서비스 생성 :

    $ nano /lib/systemd/system/brain_microservice1.service
  2. 당신이있는이 새로운 서비스 안에서 :

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. 권한을 부여하십시오.

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. 그런 다음 실행 권한을 부여하십시오.

    $ systemctl daemon-reload
  5. 활성화하면 시작시 항상 시작됩니다.

    $ systemctl enable brain_microservice1.service
  6. 그런 다음 테스트 할 수 있습니다.

    $ sudo 지금 재부팅

  7. 마침 = 성공 !!

이것은 동일한 본문 스크립트를 사용하여 쉘을 실행하고 반응합니다 ... 데이터베이스 시작 스크립트 ... 모든 종류의 OS 코드 ...이 도움이되기를 바랍니다 ...

...



0

더 간단한 방법이 있습니다!

먼저 : 쉘 스크립트를 작성하고 .sh를 저장하십시오. 여기에 예제가 있습니다.

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

이 스크립트는 시작할 때 내부 키보드를 비활성화합니다.

둘째 : "시작 응용 프로그램 환경 설정"응용 프로그램을 엽니 다

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

셋째 : 추가를 클릭하십시오. 넷째 : 이름 섹션에서 이름을 지정하십시오. 다섯 번째 : 명령 섹션에서 .sh로 이동하십시오. 여섯 번째 : 명령 섹션을 편집하여 다음을 수행하십시오.

bash <space> path/to/file/<filename>.sh <space> --start

일곱 번째 : 추가를 클릭하십시오. 그게 다야! 끝마친!

이제 PC를 재부팅하여 확인하십시오.

건배!


-1

무통, 가장 쉽고 가장 보편적 인 방법은 ~.bash_profile또는 ~.profile (bash_profile 파일이없는 경우 ) 단순히 실행하는 것입니다 .

해당 파일의 맨 아래에 실행 명령을 추가하면 시스템이 시작될 때 실행됩니다.

아래에 예가 있습니다. ~\Desktop\sound_fixer.sh


2
정확하지 않습니다. ~/.bash_profile실행하는 사용자가 로그인 할 때 - 아니 시스템이 부팅 될 때까지. 원래 질문에서, 의도는 컴퓨터를 시작할 때 Node.js 앱 서버를 실행하는 것입니다. 솔루션에서는 사용자가 Node.js 서버를 실행하기 전에 먼저 시스템에 로그인해야합니다. 그리고 어떤 종류의 문제로 인해 서버가 밤새 재부팅되는 경우 사용자가 다시 로그인 할 때까지 앱이 다시 작동하지 않습니다.
— meetamit

-6

어떤 사람들에게는 이것이 효과가 있습니다.

시스템 → 환경 설정 → 시작 응용 프로그램에 다음 명령을 간단히 추가 할 수 있습니다 .

bash /full/path/to/your/script.sh

시스템 환경 설정 메뉴에이 내용이 표시되지 않습니다. 그러나 응용 프로그램 시작 관리자에서 검색하면 볼 수 있습니다.
— OKGimmeMoney

이것은 실제로 시작시 실행되는 것이 아니라 로그인시 실행되며 이는 상당히 큰 차이입니다. 또한 모든 시스템 (특히 서버는 아님)에 "시스템> 환경 설정"이 없기 때문에 특정 설정에 따라 다릅니다.
— jazzpi

3
이 답변은 Ubuntu / Linux 데스크톱에서 더 많은 것처럼 보이지만 사용자는 실제로 GUI가없는 AWS EC2 Linux 인스턴스에 대한 도움말을 요청하고 있습니다.
— Vini.g.fer 2017
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.