我想在unix机器的后台运行一段时间(1)循环的Perl脚本,直到我杀死它为止。即使我注销,我如何在后台继续运行unix程序?
这是我没有管理权限(所以出于某种原因,我无法使用守护::一般:: While1)的远程计算机,我登录到它通过SSH,我希望它我退出后继续运行。
的一种方式,我发现是写这样的抨击:
nohup ./my_script.pl &
有一些其他的,更可取的方法来做到这一点?
编辑crontab中是被禁止在该计算机上(在运行的背景和持久的过程是不是)。
我想在unix机器的后台运行一段时间(1)循环的Perl脚本,直到我杀死它为止。即使我注销,我如何在后台继续运行unix程序?
这是我没有管理权限(所以出于某种原因,我无法使用守护::一般:: While1)的远程计算机,我登录到它通过SSH,我希望它我退出后继续运行。
的一种方式,我发现是写这样的抨击:
nohup ./my_script.pl &
有一些其他的,更可取的方法来做到这一点?
编辑crontab中是被禁止在该计算机上(在运行的背景和持久的过程是不是)。
我的优选的方法,可以说是最简单的,是使用screen
:
screen -d -m ./myProcess
我相信这应该从你的Perl脚本内工作。
$SIG{ HUP } = 'IGNORE';
注意事项的nohup手册页医生说:
要做到这一点,nohup的设置SIGHUP 信号(3)(``终端线路挂断 '') 被忽略,那么连同任何参数一起执行实用程序 。
从shell中在后台运行作业很好,这取决于您希望确保连续运行多少手工劳动。
我会使用crontab的@reboot(也可能是定期检查为好)。但是,您需要考虑到该过程可能会多次启动。处理这个问题的最简单方法是使用锁定文件。如果文件被锁定,退出,否则继续执行任务。记住要使用非阻塞检查,否则你会冒着死亡进程占用不必要的系统资源的风险。
屏幕也是一种选择,如果它是可用的。
的crontab +屏幕可以组合。
片段是在的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是否会奏效。如果没有,请在关闭标准手柄后尝试双叉。
use Proc::Daemon;
Proc::Daemon::Init;
这就是我用我的Sendmail的过滤程序,可能去的最简单的方法。该模块通过CPAN可用。
如果他无法使用守护进程::通用:: While1,因为他无法安装它,为什么Proc :: Daemon会更好地工作?它是否在Perl核心模块列表中 - 如果没有,它不会有太大的帮助。 – 2009-09-30 00:13:40
我可以得到它安装(我修改CPAN无需root密码工作),但它告诉我有关写入/ var/run的能力 – 2009-09-30 00:18:21
嗯......我看了看源代码,模块本身并没有尝试写入/ var/run(至少在我使用的版本上)。这是一个非常小的模块,因此您可能只需要查看它并使用您需要的最小代码创建更具个性化的版本。 – 2009-09-30 00:26:44
您需要关闭标准输出,标准错误,标准输入,否则你仍然绑定到特定的TTY
./my_script.pl >/dev/null 2>&1 </dev/null &
这应该做的伎俩。
完美!正是你所需要的,当没有屏幕 – b1r3k 2013-08-02 13:55:32
哈。我已经忘记了我曾经问过这个问题。屏幕也是我现在选择的工具:) – 2011-09-06 12:59:28
我最近才发现这个救生工具。 '屏幕'允许你回到命令和输入的东西。这也适用于SSH。 – Kayla 2014-08-07 05:18:27