@reboot cron 작업을 통해 "screen" 실행

@reboot cron 작업을 통해 "screen" 실행

시작 시 화면에서 스크립트를 실행하고 싶습니다.

이것은 작동하지 않습니다:

@reboot pi screen -d -m /home/pi/db_update.py

그러나 사용자 pi로 이 명령을 수동으로 실행하면 다음과 같이 작동합니다.

screen -d -m /home/pi/db_update.py

내가 무엇을 놓치고 있는지 아시나요?

답변1

사용자로 실행하고 @reboot pi ...대신 다음을 추가해야 합니다./etc/crontabcrontab -epi

@reboot /usr/bin/screen -d -m /home/pi/db_update.py

screen에 대한 전체 경로를 사용하고(단지 그것 없이도 작동하는지 확인하기 위해) /home/pi가 암호화된 파일 시스템에 있지 않은지 확인하십시오(완료). 이 명령은 cron데몬이 시작되거나 사용자가 로그인한 후에만 액세스할 수 있는 어떤 것에도 의존할 수 없습니다 .

로그인하고 연결하는 데 충분한 시간을 허용하기 위해 뭔가를 추가 하거나 db_update.py(실제로 실행되는지 확인하기 위해 파일에 기록 /var/tmp) time.sleep(600)을 Python 프로그램 끝에 넣을 수도 있습니다.


Lubuntu 13.04, Python 2.7.4에서 테스트되었으며 항목은 다음과 같습니다.

@reboot screen -d -m /home/anthon/countdown.py

그리고 countdown.py:

#!/usr/bin/env python
import time
for x in range(600,0,-1):
    print x
    time.sleep(1)

(그리고 chmod 755 countdown.py)

답변2

시작 시 화면을 무언가에 연결해야 하는 유사하지만 약간 다른 사용 사례가 있습니다. 두 개의 헤드리스 서버가 있는데 그 중 하나에는 직렬 출력만 있습니다. 직렬 케이블을 통해 다른 헤드리스 서버에 연결했으며 화면을 사용하여 직렬 연결을 통해 상호 작용해야 합니다. 또한 직렬 세션을 보지 않을 때 생성된 모든 출력이 캡처되는지 확인해야 합니다.

나는 루트의 crontab에 이것을 가지고 있습니다

@reboot    /usr/bin/screen -d -m -c .screenrc -L /dev/ttyS0

보안 업데이트가 적용되면 설정된 시간에 서버가 다시 시작됩니다. 필요할 때 볼 수 있도록 특별히 이름이 지정된 로그 파일을 원합니다. 내 파일 .screenrc에 이 항목이 있습니다.

logfile "/root/.screen_%H_%Y%m%d_%c.txt"

따라서 다음 화면 세션이 시작되면 로그 파일은 /home/root/.screen_$HOSTNAME_$YYYYMMDD_$h:$mm.txt.

답변3

이것이 해결 방법일 수도 있지만 스크린 세션을 호출하는 쉘 스크립트를 실행하여 문제를 해결했습니다.

[dude@server ~]$ crontab -l | grep sh
@reboot /home/dude/.autoscreen/start.sh
[dude@server ~]$ cat /home/dude/.autoscreen/start.sh
#!/bin/bash
cd ~
screen -S myname -d -m custom_script

답변4

시작 시 실행되는 화면에서 무슨 일이 일어나고 있는지 알아내는 몇 가지 쉬운 방법이 있습니다.

  • 시작됐나요? 다시 시작한 후에는 다음 줄 다음에 한 줄이 반환되어야 grep CRON /var/log/syslog합니다 .CMD(CRON) INFO (Running @reboot jobs)

  • 시작했지만 화면을 볼 때쯤 화면이 사라진 경우 명령을 종료하십시오. 이를 디버깅하는 방법이 있습니다. 예를 들면 다음과 같습니다.

    • 그런 다음 계속 실행되도록 셸을 실행하면 설명된 대로 출력을 확인할 수 있습니다.https://unix.stackexchange.com/a/47279/103306-screen ... -- sh -c "your command; exec sh"
    • 예를 들어 script(1)에서 명령을 실행한 다음 screen ... -- script -f yourcommand.boot.log -c "your command"로그 파일을 확인합니다.

FATAL내 경우에는 시작이 완료되지 않고 오류 메시지를 표시하는 로컬 PostgreSQL 데이터베이스에 연결을 시도하는 스크립트였습니다 . cron즉, 모든 것이 정상이지만 screen시스템 시작 시퀀스 중에 조합이 너무 빠르게 실행됩니다.

또한 전역 crontab 파일()에서 사용자 파일로 전환할 필요가 없다는 점을 언급해야 합니다. /etc/crontab예를 들어 명령을 사용하여 생성할 때 중간 지점이 있습니다. /etc/cron/local-pi-whathaveyou이렇게 하면 확인하는 사람에게는 분명 /etc하지만 권한이 없는 사용자는 그대로 유지됩니다.

관련 정보