代码之家  ›  专栏  ›  技术社区  ›  Karel Bílek

即使我注销,如何在后台继续运行unix程序?

  •  7
  • Karel Bílek  · 技术社区  · 17 年前

    我想在unix机器上运行一个Perl脚本,并在后台执行一些while(1)循环,直到我杀死它。

    我发现的一个方法是写一些类似于bash的东西:

    nohup ./my_script.pl &
    

    禁止在该计算机上编辑crontab(而不允许运行后台和长期进程)。

    6 回复  |  直到 17 年前
        1
  •  18
  •   Yuval Adam    15 年前

    我更喜欢的方法,也可以说是最简单的方法,是使用 screen

    screen -d -m ./myProcess
    
        2
  •  6
  •   user224579    17 年前

    您需要关闭stdout、stderr、stdin,否则您仍然绑定到该特定的TTY

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

    这应该能奏效。

        3
  •  1
  •   Taylor Leese    17 年前

    我相信这应该在perl脚本中起作用。

    $SIG{ HUP } = 'IGNORE';
    

    注意,nohup的手册页文档说:

    为此,nohup设置了SIGHUP 被忽略,然后执行实用程序

        4
  •  1
  •   artur-pub    17 年前

    代码段位于perldoc perlipc中:

    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: $!";
    }
    

    但如果你不是root,我不确定setsid是否会起作用。如果没有,请在关闭标准手柄后尝试使用双叉。

    一些链接: howto , daemonize

        5
  •  1
  •   Joanne C    17 年前
    use Proc::Daemon;
    Proc::Daemon::Init;
    

        6
  •  0
  •   tommym    17 年前

    从shell在后台运行作业是可以的,这取决于您希望投入多少人工来确保它持续运行。

    我会使用crontab的@reboot(也可能是定期检查)。但是,您需要考虑这个过程可能会启动多次。处理这个问题的最简单方法是使用锁文件。如果文件已锁定,请退出,否则继续执行该任务。请记住使用非阻塞检查,否则您可能会用死进程占用不必要的系统资源。

    如果可用,屏幕也是一个选项。

    crontab+屏幕可以组合使用。