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

我想在unix机器的后台运行一段时间(1)循环的Perl脚本,直到杀死它为止。

这是一个远程计算机,我没有pipe理权限(所以出于某种原因,我不能使用守护进程::通用:: While1),我通过SSHlogin到它,我希望它继续运行后我注销。

我发现的一个方法是写这样的事情:

nohup ./my_script.pl & 

还有其他更好的方法吗?

在计算机上禁止编辑crontab(当运行背景和持久的进程不是)。

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

 screen -d -m ./myProcess 

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

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

这应该做的伎俩。

我相信这应该在你的Perl脚本内工作。

 $SIG{ HUP } = 'IGNORE'; 

注意nohup的手册页文件说:

为此,nohup将SIGHUP信号(3)(“终端线挂断”)设置为忽略,然后与任何参数一起执行实用程序。

片段位于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: $!"; } 

但是我不确定setsid是否可以工作,如果你不是root的话。 如果没有,请关闭标准手柄后尝试双叉。

一些链接: 如何 , 守护进程

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

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

在shell的后台运行这个工作是很好的,取决于你想要投入多少手工劳动,以确保它连续运行。

我会使用crontab的@reboot(也可能是定期检查)。 但是,你需要考虑到这个过程可能会多次启动。 最简单的方法是使用锁定文件。 如果文件被锁定,请退出,否则继续执行任务。 请记住使用非阻塞检查,否则你会冒着死进程的风险浪费不必要的系统资源。

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

crontab +屏幕可以结合使用。