我想在unix机器上运行带有一些while(1)循环的Perl脚本,直到我杀了它。
这是一台我没有管理权限的远程计算机(因此出于某种原因,我无法使用Daemon :: Generic :: While1),我通过SSH登录,我希望它继续我退出后运行。
我发现的一种方法就是将这样的东西写成bash:
nohup ./my_script.pl &
还有其他更好的方法吗?
在该计算机上禁止编辑crontab(同时运行后台和持久进程)。
答案 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是否会起作用。如果没有,请在关闭标准手柄后尝试双叉。
答案 4 :(得分:1)
use Proc::Daemon;
Proc::Daemon::Init;
这就是我用于Sendmail过滤器程序的东西,可能是最简单的方法。该模块可通过CPAN获得。
答案 5 :(得分:0)
从shell在后台运行作业很好,这取决于你希望用多少手工劳动来确保它连续运行。
我会使用crontab的@reboot(也可能是定期检查)。但是,您需要考虑到该过程可能会多次启动。最简单的处理方法就是拥有一个锁文件。如果文件被锁定,请退出,否则继续执行该任务。请记住使用非阻塞检查,否则可能会导致死机进程占用不必要的系统资源。
如果屏幕可用,屏幕也是一个选项。
crontab + screen可以合并。