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

时间:2009-09-29 23:42:24

标签: unix

我想在unix机器上运行带有一些while(1)循环的Perl脚本,直到我杀了它。

这是一台我没有管理权限的远程计算机(因此出于某种原因,我无法使用Daemon :: Generic :: While1),我通过SSH登录,我希望它继续我退出后运行。

我发现的一种方法就是将这样的东西写成bash:

nohup ./my_script.pl &

还有其他更好的方法吗?

在该计算机上禁止编辑crontab(同时运行后台和持久进程)。

6 个答案:

答案 0 :(得分:18)

我首选的方法,可以说是最简单的方法,是使用screen

screen -d -m ./myProcess

答案 1 :(得分:6)

你需要关闭stdout,stderr,stdin,否则你仍然会被那个特定的TTY绑定

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

这应该可以解决问题。

答案 2 :(得分:1)

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

$SIG{ HUP } = 'IGNORE';

请注意nohup的手册页doc:

  

为此,nohup设置SIGHUP   signal(3)(``terminal line hangup'')   被忽略,然后执行实用程序   以及任何论据。

答案 3 :(得分:1)

Snippet是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是否会起作用。如果没有,请在关闭标准手柄后尝试双叉。

一些链接:howtodaemonize

答案 4 :(得分:1)

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

这就是我用于Sendmail过滤器程序的东西,可能是最简单的方法。该模块可通过CPAN获得。

答案 5 :(得分:0)

从shell在后台运行作业很好,这取决于你希望用多少手工劳动来确保它连续运行。

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

如果屏幕可用,

屏幕也是一个选项。

crontab + screen可以合并。