Ubuntu가 시작될 때 스크립트를 자동으로 실행하여 시작 후에 수동으로 실행할 필요는 없습니까?
Ubuntu가 시작될 때 스크립트를 자동으로 실행하여 시작 후에 수동으로 실행할 필요는 없습니까?
답변:
어떤 종류의 스크립트를 실행해야하는지에 따라 다릅니다 . 서비스 등의 경우 upstart 를 사용해야합니다 . 그러나 사용자 스크립트의 경우 gnome에서 세션 스크립트로 시작해야합니다! 시스템> 환경 설정> 시작 애플리케이션 아래를 살펴보십시오.
참고로 터미널 로그인에서 일부 스크립트를 실행해야하는 경우 홈 디렉토리 의 .bash_login 파일에 추가 할 수 있습니다 .
간단한 명령 (실행 상태를 유지할 필요가없는 명령)은 다음과 같은 Upstart 작업을 사용할 수 있습니다.
start on startup
task
exec /path/to/command
.conf
파일을 /etc/init
시스템에 부팅 할 때 루트 ~/.config/upstart
로 실행해야하는 경우 또는 로그인 할 때 사용자로 실행해야하는 경우 파일에 저장하십시오 .
system->pref->startup applications
은 /etc/init/
또는에서 찾을 수 없습니다 ~/.config/upstart
. 그래서 어디에서 시작 응용 프로그램을 정의?
한 가지 방법은 @reboot cron 작업 을 추가하는 것입니다.
crontab -e
하면 cron을 편집 할 수 있습니다.이와 같은 줄 추가하기 :
@reboot /path/to/script
컴퓨터가 부팅되면 해당 스크립트를 실행합니다.
@reboot
널리 알려져 있지 않기 때문에 키워드는 좋은 팁입니다.
man 5 crontab
된다고 말합니다 @reboot
.
rc.local
시스템 이이 시점 (PATH 등)에서 더 많은 설정을 보이기 때문에 보다 낫습니다 . 시스템 시작 후 무언가를 호출하기가 너무 어렵다는 것이 이상합니다 ..
명령을 추가하는 것은 /etc/rc.local
어떻습니까? 이 파일을 편집하려면 sudo 액세스를 사용해야합니다.
sudo nano /etc/rc.local
chmod 755 rc.local
추가 #!/bin/bash
해야합니다.
을 사용하여 시작할 때 (짧은 수명) 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 오래 지속되는 데몬과 달리.
WantedBy
예를 들어, 때 시작하세요, 여기에 사용 multi-user.target
도달한다. 당신은 사용할 수 있습니다 Before
, After
, Requires
참조, 등man systemd.unit
RemainAfterExit
귀하가 시작한 서비스 및 원하는 행동에 따라 다릅니다. 예를 들어 /bin/df -h
<s> would </ s>는을 가져야 RemainAfterExit=no
합니다.
df
그 요구에 내재 된 것은 없습니다 RemainAfterExit=no
. 실행할 때마다 명령을 반복적으로 실행하지 않는 한 systemctl start foo
.
명령을 자동으로 실행하는 방법에는 여러 가지가 있습니다.
신출내기 시스템은 디렉토리에 구성을 발견되는 모든 스크립트를 실행합니다 /etc/init
. 이 스크립트는 시스템 시작 중 (또는 종료 요청과 같은 특정 이벤트에 대한 응답으로) 실행되므로 사용자와 상호 작용하지 않는 명령을 실행할 수 있습니다. 모든 서버는이 메커니즘을 사용하여 시작됩니다.
당신은에 읽을 소개 찾을 수 있습니다 http://upstart.ubuntu.com/getting-started.html 맨 페이지를 man 5 init
하고 man 8 init
당신에게 자세한 내용을 제공합니다.
.gnomerc
홈 디렉토리에 이름이 지정된 쉘 스크립트 는 그놈 세션에 로그인 할 때마다 자동으로 제공됩니다. 거기에 임의의 명령을 넣을 수 있습니다. 이 스크립트에서 설정 한 환경 변수는 세션에서 실행하는 모든 프로그램에서 볼 수 있습니다.
.gnomerc
스크립트가 완료 될 때까지 세션이 시작되지 않습니다 . 따라서 장기 실행 프로그램을 자동 시작 &
하려면 실행중인 쉘에서 분리하기 위해 프로그램 호출 에 추가해야합니다 .
메뉴 옵션 시스템-> 환경 설정-> 시작 응용 프로그램을 사용하면 그래픽 세션이 시작될 때 시작해야 할 응용 프로그램을 정의하고 (우분투가 미리 정의) 취향에 추가하거나 제거 할 수 있습니다. 구문 .gnomerc
을 알 필요는 sh
없지만 sh
프로그래밍 구성 을 사용할 수 는 없다는 점을 제외하면 스크립트 의 목적과 범위는 거의 같습니다 .
.gnomerc
실행되는 것을 제외하고 는 ".gnomerc 스크립트의 목적과 범위가 거의 동일 합니다. " Unity의 메뉴 표시 줄에있는 프로그램을 실행해야했는데이 경우 큰 차이가있었습니다! Startup Applications
sudo update-rc.d myscript.sh defaults
여기서 /etc/init.d/myscript.sh는 스크립트이며 시작시 실행됩니다.
$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/bin
say myscript
replace to 로 직접 명령하여 실행할 수 있도록 권장됩니다 "</path/to/script>"
).
샘플 예 script.sh
:
#!/bin/bash
<commands to be executed>
exit
결과 :
스크립트를 실행하는 .desktop
파일이 시작 $HOME/.config/autostart
됩니다.Exec=
따라서 시작할 때 원하는 쉘 스크립트를 실행할 수 있습니다!
간단한 것을 위해 시스템-> 환경 설정-> 세션에서 스크립트의 위치를 가리키는 명령을 추가 할 수 있습니다 .
또는 /etc/init.d/rc.local에 추가하거나 더 낮은 수준 의 작업 인 경우 시작 작업을 수행 할 수 있습니다 .
자세한 내용 은 https://help.ubuntu.com/community/UbuntuBootupHowto 를 참조하십시오.
cron
최고 투표와 다르게 구현 된 답변이 답변은 여전히 사용 cron
되지만 최상위 투표 답변과 다른 방법을 사용합니다. 이것은 Ubuntu 16.04부터 작동하지만 훨씬 빨리 지원 될 것입니다. cron
16.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`
@reboot
.
crontab -e
어떤 사람들이 vim과 같은 인터페이스로 인해 검은 예술 중 하나를 고려 하는지를 활용 합니다. 반면에이 답변은 두뇌가 특정한 방식으로 연결된 사람들에게 호소력이있을 수 있습니다. 우리는 모두 같은 금형에서 주조되지 않습니다. 그리고 다시이 답변은 이미 하나의 투표권을 가지고 있기 때문에 민주주의가 그녀의 진로를 잡을 수있게 할 것입니다.
crontab -e
내가 항상 구글 지시를해야한다는 것을 발견 한 몇 분, 몇 시간 동안 별표 ( "*")의 기억을 불러옵니다. 나는 아직도 사용 /etc/cron.d
하고 /etc/cron.daily
선택에 간다. 특히 거울 /etc/udev/rules.d
과 /etc/systemd/system-sleep
방법 때문에 . 딱 맞는 것 같습니다.
이를 위해 upstart 를 사용해야 합니다. Upstart는 자동으로 시작되는 Ubuntu 프로세스에 사용됩니다. 이전 System-V init.d 스크립트와 같은 향상된 솔루션입니다. 또한 스크립트 시작에 전제 조건을 둘 수 있습니다 (예 : 네트워크를 실행해야합니까? 등).