it-swarm-ko.tech

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

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

511
myusuf3

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

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

14.04 이상

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

start on startup
task
exec /path/to/command

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

204
LassePoulsen

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

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

    @reboot /path/to/script
    

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

546
ceejayoz

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

Sudo nano /etc/rc.local
159

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 작업 를 시스템화 된 작업으로 변환하는 것입니다 ( pstart 사용자를위한 시스템 참조).

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

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

명령에는 항상 전체 경로가 제공되어야합니다. 명령이 실패하면 나머지는 실행되지 않습니다. 경로 앞의 _-_는 실패로 간주하지 않고 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오래 지속되는 데몬과 달리.

74
muru

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

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

    http://upstart.ubuntu.com/getting-started.html 매뉴얼 페이지 man 5 initman 8 init에 대한 자세한 내용은 다음을 참조하십시오. .

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

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

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

71
Riccardo Murri
$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의 경로로 바뀝니다.
(보통 myscript을 (를) /usr/local/bin로 대체하여 직접 명령하여 실행할 수 있도록 "</path/to/script>"에 권장 됨].

script.sh의 샘플 예 :

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

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

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

27
Pandya

간단한 것을 위해 System-> Preferences-> Sessions 에 스크립트의 위치를 ​​가리키는 명령을 추가 할 수 있습니다.

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

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

18
tutuca

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

5
txwikinger

cron 답변이 최다 투표와 다르게 구현 됨

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

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`
4
WinEunuuchs2Unix