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


366

아마존 S3 리눅스 인스턴스, 나는 두 개의 스크립트 호출이 start_my_appstop_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.