시작할 때 스크립트를 실행하는 방법은 무엇입니까?


520

Ubuntu가 시작될 때 스크립트를 자동으로 실행하여 시작 후에 수동으로 실행할 필요는 없습니까?


3
누군가가 WHEN과 WHERE를 모두 보여줄 수 있다면 정말 좋을 것입니다. 다른 응용 프로그램이 시작되기 전에 실행되는 스크립트를 시작하는 최소한 두 가지 방법이 있다는 것을 알고 있기 때문에 (X11처럼)
Buttink

1
이 전체 답변 스레드는 엉망입니다. Stack Exchange 형식이이 질문에 가장 적합하지 않은 것 같습니다
Gabriel Fair

1
실제로는 매우 즐겁습니다. 몇 가지 다른 방법이있을 수 있습니까?
devios1

답변:


206

어떤 종류의 스크립트를 실행해야하는지에 따라 다릅니다 . 서비스 등의 경우 upstart 를 사용해야합니다 . 그러나 사용자 스크립트의 경우 gnome에서 세션 스크립트로 시작해야합니다! 시스템> 환경 설정> 시작 애플리케이션 아래를 살펴보십시오.

참고로 터미널 로그인에서 일부 스크립트를 실행해야하는 경우 홈 디렉토리 의 .bash_login 파일에 추가 할 수 있습니다 .

14.04 이상

간단한 명령 (실행 상태를 유지할 필요가없는 명령)은 다음과 같은 Upstart 작업을 사용할 수 있습니다.

start on startup
task
exec /path/to/command

.conf파일을 /etc/init시스템에 부팅 할 때 루트 ~/.config/upstart로 실행해야하는 경우 또는 로그인 할 때 사용자로 실행해야하는 경우 파일에 저장하십시오 .


58
SO 및 StackExchange가 실행되는 방식을 고려할 때 시작 스크립트의 예와 위치는 무엇입니까? 그렇게하면 훨씬 더 나은 대답이 될 것입니다. 귀하의 링크는 유지되지 않고 시작 요리 책을 보라고 말합니다. 어디서부터 시작해야할지 전혀 몰랐습니다.
Ehtesh Choudhury 2013

2
명령을 루트로 실행해야하는 경우 어떻게합니까?
dopatraman

1
@dopatraman 대답은 이것으로 모든 프로세스가 루트로 실행된다고 말합니다.
AStopher

4
upstart (Ubuntu 15.04+)가 아닌 systemd를 실행하는 시스템에서 수행 할 작업을 설명하려면이 답변을 업데이트하십시오.

3
이 대답은 나에게 이해가되지 않습니다. 에 나열된 응용 프로그램 system->pref->startup applications/etc/init/또는에서 찾을 수 없습니다 ~/.config/upstart. 그래서 어디에서 시작 응용 프로그램을 정의?
Blauhirn

553

한 가지 방법은 @reboot cron 작업 을 추가하는 것입니다.

  1. 실행 crontab -e하면 cron을 편집 할 수 있습니다.
  2. 이와 같은 줄 추가하기 :

    @reboot /path/to/script
    

    컴퓨터가 부팅되면 해당 스크립트를 실행합니다.


85
@reboot널리 알려져 있지 않기 때문에 키워드는 좋은 팁입니다.
jathanism

12
좋은. 이것이 언제 발생 하는지 정확히 알고 있습니까?
Oli

2
전원이 꺼 졌는데도 PC가 다시 켜지면 작동하지 않습니다.
Mike Wills 2016 년

18
@siamii : 시작시 (크론 데몬이 시작될 때) 실행 man 5 crontab된다고 말합니다 @reboot.
jfs

9
대단해. 지금까지는 rc.local시스템 이이 시점 (PATH 등)에서 더 많은 설정을 보이기 때문에 보다 낫습니다 . 시스템 시작 무언가를 호출하기가 너무 어렵다는 것이 이상합니다 ..
Karthik T

161

명령을 추가하는 것은 /etc/rc.local어떻습니까? 이 파일을 편집하려면 sudo 액세스를 사용해야합니다.

sudo nano /etc/rc.local

19
이것은 시스템이 부팅 될 때 단순히 일부 스크립트를 실행하는 방법에 대한 질문에 직접 대답합니다. upstart는보다 복잡한 작업을 수행합니다. 데몬 프로세스를 시작합니다.
Dogweather

1
upstart는 데몬 프로세스를 시작하고 /etc/rc.local은 bash 스크립트를 시작합니까?
Donato

5
그래야합니까? 요즘 더 이상 작동하지 않습니다.
DaVince

4
우분투 17.04 시스템과의 Doenst 작업
qodeninja

3
이 파일을 직접 만든 경우 (와 같이) 파일을 실행 파일로 변경 하고 첫 번째 줄에 chmod 755 rc.local추가 #!/bin/bash해야합니다.
psitae

77

15.04 이상 :

을 사용하여 시작할 때 (짧은 수명) 1 명령 을 실행하려면 systemd유형의 시스템 단위를 사용할 수 있습니다 OneShot. 예를 들어 다음을 /etc/systemd/system/foo.service포함 하여 작성하십시오 .

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

그런 다음 다음을 실행하십시오.

sudo systemctl daemon-reload
sudo systemctl enable foo.service

기본적으로 이는 일반적인 Upstart 작업시스템화 된 작업 으로 변환 하는 것입니다 ( Upstart 사용자를위한 Systemd 참조 ).

여러 ExecStart줄을 사용하여 동일한 서비스 파일에서 여러 명령을 실행할 수 있습니다 .

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

명령에는 항상 전체 경로가 제공되어야합니다. 명령이 실패하면 나머지는 실행되지 않습니다. -경로 앞의 A 는 실패로 간주하지 않고 0이 아닌 종료 상태를 무시하도록 systemd에 지시합니다.

관련된:


사용자 세션의 경우 ~/.config/systemd대신 시스템 단위를 만들 수 있습니다 . 이것은 16.04 이상에서 작동하지만 systemd가있는 이전 버전의 Ubuntu 릴리스에서는 작동하지 않습니다 (사용자 세션에서 여전히 Upstart를 사용했기 때문에). 사용자 세션 단위는 시스템 서비스와 동일한 명령으로 제어 할 수 있지만 --user옵션이 추가됩니다.

systemctl --user daemon-reload
systemctl --user status foo.service

쉘 구문

Upstart와 달리 systemd는 Exec*셸을 통해 명령을 실행하지 않습니다 . 그것은 제한된 변수 확장과 다중 명령 (으로 분리 ;) 자체를 수행하지만 쉘과 같은 구문에 관한 것입니다. 리디렉션이나 파이프와 같이 더 복잡한 작업은 명령을 sh -c '...'또는로 감싸십시오 bash -c '...'.


1 오래 지속되는 데몬과 달리.


작업에 우선 순위를 설정할 수 있습니까? 또는 다른 서비스가 먼저 시작되도록 지정합니까?
r3wt

1
@ r3wt 예, 다른 방법이 있습니다. 는 WantedBy예를 들어, 때 시작하세요, 여기에 사용 multi-user.target도달한다. 당신은 사용할 수 있습니다 Before, After, Requires참조, 등man systemd.unit
muru

@PerlDuck만이 부족한 것은 아닙니다. 감사!
muru

천만에요. — Btw, RemainAfterExit귀하가 시작한 서비스 및 원하는 행동에 따라 다릅니다. 예를 들어 /bin/df -h<s> would </ s>는을 가져야 RemainAfterExit=no합니다.
PerlDuck

@PerlDuck df그 요구에 내재 된 것은 없습니다 RemainAfterExit=no. 실행할 때마다 명령을 반복적으로 실행하지 않는 한 systemctl start foo.
muru

71

명령을 자동으로 실행하는 방법에는 여러 가지가 있습니다.

  1. 신출내기 시스템은 디렉토리에 구성을 발견되는 모든 스크립트를 실행합니다 /etc/init. 이 스크립트는 시스템 시작 중 (또는 종료 요청과 같은 특정 이벤트에 대한 응답으로) 실행되므로 사용자와 상호 작용하지 않는 명령을 실행할 수 있습니다. 모든 서버는이 메커니즘을 사용하여 시작됩니다.

    당신은에 읽을 소개 찾을 수 있습니다 http://upstart.ubuntu.com/getting-started.html 맨 페이지를 man 5 init하고 man 8 init당신에게 자세한 내용을 제공합니다.

  2. .gnomerc홈 디렉토리에 이름이 지정된 쉘 스크립트 는 그놈 세션에 로그인 할 때마다 자동으로 제공됩니다. 거기에 임의의 명령을 넣을 수 있습니다. 이 스크립트에서 설정 한 환경 변수는 세션에서 실행하는 모든 프로그램에서 볼 수 있습니다.

    .gnomerc스크립트가 완료 될 때까지 세션이 시작되지 않습니다 . 따라서 장기 실행 프로그램을 자동 시작 &하려면 실행중인 쉘에서 분리하기 위해 프로그램 호출 에 추가해야합니다 .

  3. 메뉴 옵션 시스템-> 환경 설정-> 시작 응용 프로그램을 사용하면 그래픽 세션이 시작될 때 시작해야 할 응용 프로그램을 정의하고 (우분투가 미리 정의) 취향에 추가하거나 제거 할 수 있습니다. 구문 .gnomerc을 알 필요는 sh없지만 sh프로그래밍 구성 을 사용할 수 는 없다는 점을 제외하면 스크립트 의 목적과 범위는 거의 같습니다 .


11
3) " Unity 로드 하기 전에 실행 되고 Unity 로드 한 후에.gnomerc 실행되는 것을 제외하고 는 ".gnomerc 스크립트의 목적과 범위가 거의 동일 합니다. " Unity의 메뉴 표시 줄에있는 프로그램을 실행해야했는데이 경우 큰 차이가있었습니다! Startup Applications
그 브라질 사람

1
@ ruda.almeida 지적 해 주셔서 감사합니다. 답은 화합 전일에 기록되었습니다.
Riccardo Murri

1
sudo update-rc.d myscript.sh defaults여기서 /etc/init.d/myscript.sh는 스크립트이며 시작시 실행됩니다.
Dan Dascalescu

27
$HOME/.config/autostart
  • 이 위치에는 시작 응용 프로그램 목록이 있습니다.
  • .desktop 시작시 실행될 파일을 여기에 넣을 수 있습니다.

.desktop파일 샘플 예 :

다음 .desktop파일을 $HOME/.config/autostart넣고 제공 chmod +x:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

여기 "</path/to/script>"에 경로가 바뀝니다 script.sh
(일반적으로 /usr/local/binsay myscriptreplace to 로 직접 명령하여 실행할 수 있도록 권장됩니다 "</path/to/script>").

샘플 예 script.sh:

#!/bin/bash
<commands to be executed>
exit

결과 : 스크립트를 실행하는 .desktop파일이 시작 $HOME/.config/autostart됩니다.Exec=

따라서 시작할 때 원하는 쉘 스크립트를 실행할 수 있습니다!


18

간단한 것을 위해 시스템-> 환경 설정-> 세션에서 스크립트의 위치를 ​​가리키는 명령을 추가 할 수 있습니다 .

또는 /etc/init.d/rc.local에 추가하거나 더 낮은 수준 의 작업 인 경우 시작 작업을 수행 할 수 있습니다 .

자세한 내용 은 https://help.ubuntu.com/community/UbuntuBootupHowto 를 참조하십시오.


7

cron 최고 투표와 다르게 구현 된 답변

이 답변은 여전히 ​​사용 cron되지만 최상위 투표 답변과 다른 방법을 사용합니다. 이것은 Ubuntu 16.04부터 작동하지만 훨씬 빨리 지원 될 것입니다. cron16.04 이후 컴퓨터가 부팅 될 때 작업을 실행 하기 시작했습니다 .

언제 cron실행됩니까?

댓글에서 누군가 "언제 그들이 실행합니까?" syslog / journalctl에서 말할 수 있습니다.

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

한 가지주의해야 할 것은 cron작업 실행 상태와 작업 실행 상태를 이메일로 알려주 @reboot므로 sleep명령을 스크립트에 넣지 않으면 초기 네트워크 관리자와 이메일이 실행되지 않습니다 .

스크립트를 넣을 위치

스크립트를 디렉토리에 넣으십시오 /etc/cron.d.

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

스크립트는 어떻게 생겼습니까?

다음은 각 부팅을 실행하기 위해 설정 한 몇 가지 스크립트입니다.

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`

1
cronjobs을 추가하는 방법에는 여러 가지가 있지만, 가장 높은 투표 응답의 핵심은 귀하의 답변입니다 @reboot.
muru

crontab 을 추가하기위한 대체 방법은 askubuntu.com/q/2368/158442에 게시해야하며 , 이는 Cron 작업 추가에 관한 것입니다.
muru

1
나는달라고 간청한다. 문제의 답의 핵심은 crontab -e어떤 사람들이 vim과 같은 인터페이스로 인해 검은 예술 중 하나를 고려 하는지를 활용 합니다. 반면에이 답변은 두뇌가 특정한 방식으로 연결된 사람들에게 호소력이있을 수 있습니다. 우리는 모두 같은 금형에서 주조되지 않습니다. 그리고 다시이 답변은 이미 하나의 투표권을 가지고 있기 때문에 민주주의가 그녀의 진로를 잡을 수있게 할 것입니다.
WinEunuuchs2Unix

2
오 제발. 당신과 나는 편집자가 바뀔 수 있다는 것을 알고 있습니다.
muru

@muru 아마도 당신이 저를 가르쳐서 나노 나 다른 CLI와 같은 것으로 에디터를 바꾸는 법을 배웠기 때문일 것입니다. 그러나 나는 gedit 캠프에 있습니다. 게다가 crontab -e내가 항상 구글 지시를해야한다는 것을 발견 한 몇 분, 몇 시간 동안 별표 ( "*")의 기억을 불러옵니다. 나는 아직도 사용 /etc/cron.d하고 /etc/cron.daily선택에 간다. 특히 거울 /etc/udev/rules.d/etc/systemd/system-sleep방법 때문에 . 딱 맞는 것 같습니다.
WinEunuuchs2Unix

5

이를 위해 upstart 를 사용해야 합니다. Upstart는 자동으로 시작되는 Ubuntu 프로세스에 사용됩니다. 이전 System-V init.d 스크립트와 같은 향상된 솔루션입니다. 또한 스크립트 시작에 전제 조건을 둘 수 있습니다 (예 : 네트워크를 실행해야합니까? 등).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.