crontab의 @reboot는 루트에서만 작동합니까?


64

man 5 crontab crontab을 사용하여 부팅시 스크립트를 실행하는 방법에 대해 명확합니다.

   These special time specification "nicknames" are supported, which replace the 5 initial time and date
   fields, and are prefixed by the `@` character:
   @reboot    :    Run once after reboot.

그래서 행복하게 내 crontab에 단일 행을 추가했습니다 (루트가 아닌 사용자 계정 아래).

@reboot     /home/me/myscript.sh

그러나 어떤 이유로 든 myscript.sh는 컴퓨터 재부팅시 실행되지 않습니다. (명령 줄에서 호출하면 제대로 실행되므로 권한 문제가 아닙니다)

내가 무엇을 놓치고 있습니까?


@Anthon의 질문에 답변하기 위해 업데이트하십시오.

  1. Oracle-linux 버전 : 5.8 (uname : 2.6.32-300.39.2.el5uek # 1 SMP)
  2. 크론 버전 : vixie-cron-4.1-81.el5.x86_64
  3. 예, /home 있습니다 마운트 된 파티션. 이것이 문제인 것 같습니다. 이 문제를 어떻게 해결합니까?
  4. 현재는 myscript.sh에있는 파일에 문자 메시지 만 에코합니다 /home/me.

2
사용자 crontab은 @reboot 옵션을 지원하지 않으며, 일단 당신이 파고 시작하면 몇 가지 crontab 레이아웃이 있습니다.
X Tian

@XTian 감사합니다. 루트 이외의 사용자로 재부팅 할 때 스크립트를 실행하는 권장 방법은 무엇입니까?
보류

2
당신이 빠진 것은 불분명하지만 우리가 빠진 것은 세부 사항입니다. 어떤 버전의 oracle-linux를 실행하고 있습니까? 어떤 버전의 크론이 있습니까? 가 /home마운트 된 파티션은? 당신의 내용은 무엇입니까 /home/me/myscript.sh?
Anthon

1
Oracle Lin을 사용하는 경우 ver. 5 vixie-cron + 관련 문제에 대한이 변경 로그가 있습니다 @reboot. oss.oracle.com/pipermail/el-errata/2012-March/002655.html
slm

1
@Daniel- myscript.sh실행 가능합니까? chmod +x myscript.sh.
slm

답변:


47

cron의 구현이 다르기 때문에 약간 혼란스러운 주제 일 수 있습니다. 또한이 기능을 손상시킨 몇 가지 버그가 있었고 특히 종료 / 부팅 대 재부팅을 수행하는 경우 작동하지 않는 사용 사례도 있습니다.

버그

데이터 포인트 # 1

cron : @reboot jobs is not run 이라는 제목의 데비안 버그가 여기에 포함되어 있습니다 . 이것은 우분투에도 들어간 것으로 보이며 직접 확인할 수는 없습니다.

데이터 포인트 # 2

우분투에서 버그에 대한 증거는이 SO Q & A에서 @reboot cronjob not running 이라는 제목으로 확인 된 것으로 보입니다 .

발췌

comment # 1 : .... 3) 귀하의 crond 버전이 @reboot를 지원하지 않을 수 있습니다 vix의 crond를 사용하고 있습니까? ... crontab -l -u 사용자의 결과 표시

comment # 2 : ... cron의 @reboot의 특정 버전에 의존하는 대신 init 스크립트로 설정하는 것이 좋습니다.

주석 # 3 : ... @MarkRoberts가 재부팅을 제거하고 1 * * * *를 * / 1 * * * *로 수정하면 문제가 해결됩니다! 담당자 마크를 어디로 보내나요? 감사합니다!

해당 Q & A에서 허용 된 답변에도 다음과 같은 의견이있었습니다.

Lubuntu는 @Reboot Cron 구문을 지원하지 않습니다.

추가 증거

데이터 포인트 # 3

추가 증거로 누군가가 똑같은 것을 시도하고 그것이 작동하지 않는다는 좌절감을 느꼈다는이 실이있었습니다. 제목 것 : 스레드 : 크론 - @reboot 작업이 작동하지 않습니다 .

발췌

다시 : Cron-@reboot 작업이 작동하지 않습니다

ceelred 썼습니다 : 게시물이 날 죽이고있다 ... 래퍼 스크립트를 시도했다. 수동으로 실행하면 로그 파일이 생성됩니다. 재부팅 중이며 작업이 실행되지 않거나 로그 파일이 생성되지 않습니다.

Syslog는 CRON이 작업을 실행했음을 보여 주지만 다시는 출력이없고 프로세스가 실행되고 있지 않습니다. Jul 15 20:07:45 RavenWing cron [1026] : (CRON) INFO (@reboot 작업 실행) Jul 15 20:07:45 RavenWing CRON [1053] : (청소) CMD (/ home / ceallred / Scripts / run_spideroak. sh> /home/ceallred/Scripts/SpiderOak.log 2> & 1 &)

cron이 @reboot 명령을 좋아하지 않는 것 같습니다. 다른 아이디어가 있습니까?

알았어 ... 부분적으로 해결 됐어 이 문제를 해결 된 것으로 표시하고 새 문제로 새 스레드를 시작하겠습니다 .....

CRON이 스크립트를 실행하려고 할 때 (/ home / username / scripts에 저장된) 암호화 된 홈 디렉토리가 마운트되지 않은 것 같습니다. / usr / scripts로 이동했으며 작업이 예상대로 실행됩니다.

그래서 이제 그것은 스파이더 오크 문제 인 것처럼 보입니다. 프로세스가 시작되지만 부팅 프로세스가 완료 될 때까지 사라졌습니다. 나는 어떤 이유로 추락을 추측하고 있습니다 ... 그것에 대해 물어볼 새로운 스레드.

모든 도움을 주셔서 감사합니다!

위의 사용자가 자신의 문제를 파악한 후에 @reboot는 사용자의 crontab 항목에서 작업 할 수있었습니다 .

우분투에서 어떤 버전의 크론이 사용되는지는 확실하지 않지만 사용자가 사용할 수 @reboot있거나 후속 버전의 크론에서 버그가 수정 되었음을 나타냅니다 .

데이터 포인트 # 4

CentOS 6에서 다음을 테스트했으며 작동했습니다.

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1

그런 다음 시스템을 재부팅했습니다.

$ sudo reboot

재부팅 후.

$ cat reboot.txt 
hi

핵심, 관심사

  1. 이 기능은 시스템 및 사용자 crontab 항목 모두에서 지원되는 것 같습니다.
  2. 특정 배포판 및 / 또는 cron 패키지 버전에서 지원 / 작동하는지 확인해야합니다.

실제 메커니즘의 작동 방식에 대한 자세한 내용 @reboot은 내부를 설명하는이 블로그 게시물을 참조하십시오. 제목은 @reboot-간단한 cron 마술을 설명합니다 .

크론 디버깅

crondRHEL / CentOS / Fedora 기반 배포판의이 구성 파일에 다음을 추가 하여 자세한 정보를 표시 할 수 있습니다 .

$ more crond 
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-L 2"

유효한 수준은 0, 1 또는 2입니다.이 파일을 기본 로깅 수준으로 되돌리려 "-L 2"면 상황 디버깅이 완료된 후를 제거하면 됩니다.


있어 의견을 어제, 당신의 대답에 고개 좋은 밤 잠 후 자신을 대답하기로 결정했다. @reboot를 다시 시도한 VM을 설정하고 내 답변을 게시하고 싶을 때만 답을 '답장'으로 보았습니다 :-(
Anthon

@Anthon-죄송합니다. 어제 빨리 대답 한 다음 계속 조사하여 매우 상충되는 세부 정보를 찾았습니다. 데비안에서 버그와 Ubuntu SO에 관한 버그를 발견했을 때 나는 무엇을하고 있는지 깨달았습니다. 나는 그것이 CentOS에서 작동 @reboot하고 특정 크론에서는 괜찮고 다른 크론에서는 버그 가 있음을 알았 습니다. 따라서 혼란.
slm

OP는 세부 사항을 거의 제공하지 않지만 스크립트에서 아직 작동하지 않는 (부팅시) 실패한 것을 쉽게 사용할 수 있거나 아직 마운트되지 않은 디스크에 상주 할 수 있습니다. OP가 언급 한 내 대답은 타사에서도 확인되었습니다. 검은 백조 문제입니다 ...
Anthon

@Anthon-예 내 데이터 포인트 중 하나가 바로 그 것입니다. @reboot아직 마운트되지 않은 암호화 된 드라이브에 액세스하려고한다는 것을 깨달았을 때 작동했습니다.
slm

3
지연 시간을 추가하여 우분투의 버그를 쉽게 해결할 수 있음을 지적 할 수 있습니다 @reboot sleep 60; <your command>. 스레드를 인용하자면, "제 생각에는 cron의 @reboot 지시어가 부팅 프로세스에서 너무 일찍 실행되고 있습니다"
pzkpfw

12

우분투 컴퓨터에서 @reboot 시간에 dns 서비스에 액세스 할 수 없다는 것을 알았습니다. 이로 인해 원격 볼륨을 마운트하지 못했습니다. 이 코니는 간단하지만 간단한 해결책은 다음과 같습니다.

@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log

(루트 크론에서; 디버깅을 위해서만 마지막 부분)


이것은 루트가 아닌 사용자를 위해 실제로 우분투 16.04에서 작동하는 유일한 것입니다!
Aleksandar Pavić

Debian 8 jessie (gnome 3)에서는 작동하지 않습니다. :(
Tadej

이것은 VMWare 공유 폴더를 별도의 위치에 마운트 할 때 효과적이었습니다.
jgshawkey

3

맥 OSX도 있고 스크립트가 실행되지 않는 것과 같은 문제가있었습니다. 하지만 내가 좋아하는 스크립트를 고쳤을 때

@reboot   cd /home/me/  && sh myscript.sh

그것은 나를 위해 잘 작동했습니다. 명령을 실행하여 쉘 파일을 실행 가능하게 만드십시오.

chmod +x myscript.sh

2

이미 해결했는지 또는 위의 방법 중 하나가 필요한 솔루션인지는 모르겠지만 다른 가능성은 다음과 같습니다.

/ home 디렉토리를 암호화 한 경우, 로그인 할 때까지 사용할 수 없습니다 (예 : 재부팅 할 때 사용할 수 없음).

이 시나리오에서는 스크립트를 / srv 또는 / opt 또는 / usr / local / bin /과 같은 다른 위치로 옮길 수 있습니다.


1

Ubuntu Gnome 13.10을 새로 설치하십시오 (필자의 경우 기본 사용자 : avanderneut).

avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h  dom mon dow   command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ sudo reboot
[sudo] password for avanderneut: 

재부팅 후 파일 /var/tmp/xxx없었지만 재부팅 후 파일 이 있음을 확인하십시오 .

이것은 cron 버전 3.0으로 수행되었습니다.

스크립트가 실행될 때 사용할 수없는 서비스 디스크 등이 사용되지 않도록해야합니다. 위와 같은 간단한 것으로 시작하여 전자 메일이 작동하지 않을 수 있으므로 터미널 출력이 없는지 확인하십시오.

이것이 작동하지 않고이 기능이 필요한 경우 최신 cron (또는 oracle-linux에서 업그레이드)이 필요할 수도 있습니다.


질문에 답변하기 위해 OP를 업데이트했습니다. 의심은 처음부터 올바른 것으로 판명되었습니다. 재부팅시 실행할 스크립트는 마운트 가능한 /dev/mapper/VolGroup00-LogVol01파티션에 있습니다.
보류

@Daniel 알려 주셔서 감사합니다. 범인을 발견하게되어 기쁩니다. 파티션이 마운트 될 때까지 cron 시작을 지연시킬 수 있는지 잘 모르겠습니다. 일부 시작은 병렬로 수행되며 종속성을 변경해야합니다. 나는 그것을 망쳐 놓고 싶지 않다 cron. IMHO는 시작시 사용자로 무언가를 실행하려면 crontab & @reboot와 다른 경로를 사용해야합니다.
Anthon

0

나는 그 질문에 대해 예라고 말할 것이다. 재부팅시 cron을 실행하는 데 어려움이 있었고 (Debian 3.10.70) 다음과 같이 해결했습니다.

@reboot root /usr/bin/python3 /path/to/script

그리고 개행 문자 '\ n'을 결국

이것은 파일의 내용입니다 :

/etc/cron.d/runOnReboot

마지막으로, 나는 그것이 초록에서 주목할 가치가 있다고 생각합니다. man 5 crontab

... cron 명령의 형식은 V7 표준과 매우 호환되며 여러 가지 상위 호환 확장이 있습니다. 각 줄에는 5 개의 시간 및 날짜 필드와 명령, 줄 바꿈 문자 ( '\ n')가 있습니다. 시스템 crontab (/ etc / crontab)은 명령의 사용자 이름이 시간 및 날짜 필드 뒤에 그리고 명령 전에 지정된다는 점을 제외하고 동일한 형식을 사용합니다. 필드는 공백 또는 탭으로 구분 될 수 있습니다. 명령 필드에 허용되는 최대 길이는 998 자입니다. ...


0

우선, 루트로 로그인해야합니다 :

sudo -i

그런 다음 crontab을 엽니 다.

크론 탭 -e

그런 다음 아래처럼 루트로 스크립트를 crontab에 추가하십시오.

@ 재부트 루트 / home / user1 / Desktop / my_script

결과적으로 스크립트가 올바르게 작동하는 것을 보았습니다.

참고 : 현재 사용자로 crontab을 편집하면 재부팅으로 스크립트를 올바르게 호출 할 수 없습니다.


-1

프 루바 :

usuario @ ubuntu : ~ $ 터치 script.sh usuario @ ubuntu : ~ $ chmod + x script.sh

usuario @ ubuntu : ~ $ $ crontrab -e

@ 재부팅 /home/usuario/script.sh

PC를 저장하고 다시 시작하십시오

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