我想在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 +屏幕可以结合使用。