Я использовал Charles в течение последних лет. Очень довольный им.
Вам нужно закрыть stdout, stderr, stdin, иначе вы по-прежнему будете привязаны к этому конкретному TTY
./my_script.pl >/dev/null 2>&1 </dev/null &
Это должно помочь.
Фрагмент кода находится в 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: $!";
}
Но я не уверен, будет ли setid работать, если вы не root. Если нет, попробуйте выполнить двойной форк после закрытия стандартных дескрипторов.
use Proc::Daemon;
Proc::Daemon::Init;
Это то, что я использую для моей программы фильтрации Sendmail, и, вероятно, это самый простой способ. Модуль доступен через CPAN.
Я считаю, что это должно работать внутри вашего Perl-скрипта.
$SIG{ HUP } = 'IGNORE';
Обратите внимание, что документ на странице руководства для nohup говорит:
Для этого, signal (3) (`` зависание терминальной линии '') игнорировать, затем запускает утилиту вместе с любыми аргументами.
Запуск задания в фоновом режиме из оболочки - это нормально, в зависимости от того, сколько ручного труда вы хотите вложить, чтобы убедиться, что оно выполняется постоянно.
Я бы использовал @reboot crontab (а также, возможно, регулярную проверку). Но тогда нужно учесть, что процесс может запускаться несколько раз. Самый простой способ справиться с этим - иметь файл блокировки. Если файл заблокирован, выйдите, иначе продолжайте выполнение задачи. Не забудьте использовать неблокирующие проверки, иначе вы рискуете перегружать ненужные системные ресурсы мертвыми процессами.
screen также можно использовать, если он доступен.
crontab + screen можно объединить.