2009-09-29 5 views
7

내가 죽일 때까지 유닉스 시스템의 백그라운드에서 while (1) 루프를 사용하여 Perl 스크립트를 실행하고 싶다.로그 아웃 한 후에도 백그라운드에서 유닉스 프로그램을 계속 실행하려면 어떻게해야합니까?

이것은 관리 권한이없는 원격 컴퓨터이므로 (어떤 이유로 Daemon :: Generic :: While1을 사용할 수 없음) SSH를 통해 로그인하고 로그 아웃 한 후에도 계속 실행하십시오.

nohup ./my_script.pl & 

그것을 할 다른,보다 바람직한 방법이 있나요 : 내가 발견

한 가지 방법은 bash는이 같은 쓰기인가?

crontab을 편집하는 것은 해당 컴퓨터에서 금지됩니다 (백그라운드 및 오래 지속되는 프로세스는 실행되지 않습니다).

답변

17

내 선호하는 방법, 그리고 :

screen -d -m ./myProcess 
+1

하. 나는이 질문을 한 번도 잊었다. 화면이 현재 선택 도구입니다. :) –

+0

최근에이 구명 도구를 발견했습니다. '화면'을 사용하면 명령으로 돌아가서 물건을 입력 할 수 있습니다. 이것은 또한 SSH와 완벽하게 작동합니다. – Kayla

1

필자는이 스크립트가 perl 스크립트에서 작동해야한다고 생각합니다.

$SIG{ HUP } = 'IGNORE'; 

참고 nohup을위한 매뉴얼 페이지 문서는 말한다 :

는 SIGHUP 신호를 설정 nohup을이를 위해 (3) (``터미널 라인 끊기 '') 후 무시하기 모든 인수와 함께 유틸리티 을 실행합니다.

0

쉘에서 백그라운드로 작업을 실행하는 것은 괜찮은지, 지속적으로 실행 중인지 확인하기 위해 얼마나 많은 수작업을 필요로하는지에 따라 다릅니다.

나는 crontab의 @reboot (그리고 아마도 정기 검진)를 사용할 것이다. 하지만 프로세스가 여러 번 시작될 수 있다는 점을 고려해야합니다. 가장 간단한 방법은 잠금 파일을 갖는 것입니다. 파일이 잠긴 경우 종료하고, 그렇지 않으면 작업을 계속하십시오. 비 차단 체크를 사용하십시오. 그렇지 않으면 불필요한 시스템 리소스를 죽은 프로세스로 처리해야 할 위험이 있습니다.

화면 또한 사용 가능한 경우 옵션입니다.

crontab + 화면을 결합 할 수 있습니다.

use POSIX 'setsid'; 

sub daemonize { 
    chdir '/'    or die "Can't chdir to /: $!"; 
    open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; 
    open STDOUT, '>/dev/null' 
          or die "Can't write to /dev/null: $!"; 
    defined(my $pid = fork) or die "Can't fork: $!"; 
    exit if $pid; 
    setsid     or die "Can't start a new session: $!"; 
    open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; 
} 

하지만 난 당신이 루트하지 않으면 setsid 작동 여부를 확실하지 않다 :

+0

편집의 crontab은 해당 컴퓨터에 금지되어 있습니다. –

+0

그러면 프로세스가 계속 실행되는지 (즉 재부팅 후) 확인할 수 없습니다. 화면과 nohup/SIGHUP 트래핑 여전히 유효한 방법입니다. – tommym

+0

조언을 얻으려면 관리자에게 컴퓨터에 백그라운드 프로세스를 적용 해달라고 부탁하십시오. crontab을 허용하지 않으면 관리자가 주위를 돌아 다니는 것을 좋아하지 않을 수 있습니다. 아마도 당신이 멋지게 묻는다면 당신은 허용 될 것입니다 :) – tommym

1

발췌문은 perldoc을의 perlipc입니다. 그렇지 않으면 표준 핸들을 닫은 후에 이중 포크를 시도하십시오.

몇 가지 링크 : howto, daemonize 내 센드 메일 필터 프로그램과 갈 아마 가장 쉬운 방법을 무엇을 사용

1
use Proc::Daemon; 
Proc::Daemon::Init; 

. CPAN을 통해 모듈을 사용할 수 있습니다.

+0

그가 설치할 수 없기 때문에 Daemon :: Generic :: While1을 사용할 수 없다면 왜 Proc :: Daemon이 더 잘 작동할까요? Perl 핵심 모듈 목록에 있습니까? 그렇지 않으면 많은 도움이되지 않습니다. –

+0

설치가 가능합니다. (루트 암호없이 작동하도록 CPAN이 수정되었습니다.)하지만/var/run에 쓸 수있는 기능에 대해 알려줍니다. –

+0

흠 ... 원본을보고 모듈 자체가 시도하지 않습니다./var/run에 쓰기 (적어도 내가 사용하고있는 버전에서). 꽤 작은 모듈이므로, 여러분이 필요로하는 최소한의 코드로 좀 더 개인적인 버전을 만들고 싶을 수도 있습니다. –

6

당신은 그렇지 않으면 당신은 여전히 ​​트릭을 할해야 특정 TTY

./my_script.pl >/dev/null 2>&1 </dev/null & 

이 결합되어, 표준 입력, 표준 오류, 표준 출력을 닫아야합니다.틀림없이 가장 쉬운, screen을 사용

+0

완벽! 정확하게 화면이 없을 때 필요한 것 – b1r3k

관련 문제