Как я могу продолжать выполнять программу Unix в фоновом режиме, даже если я выхожу из системы?

Я использовал Charles в течение последних лет. Очень довольный им.

7
задан brian d foy 30 September 2009 в 00:01
поделиться

5 ответов

Вам нужно закрыть stdout, stderr, stdin, иначе вы по-прежнему будете привязаны к этому конкретному TTY

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

Это должно помочь.

6
ответ дан 6 December 2019 в 06:37
поделиться

Фрагмент кода находится в 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. Если нет, попробуйте выполнить двойной форк после закрытия стандартных дескрипторов.

некоторые ссылки: howto , daemonize

1
ответ дан 6 December 2019 в 06:37
поделиться
use Proc::Daemon;
Proc::Daemon::Init;

Это то, что я использую для моей программы фильтрации Sendmail, и, вероятно, это самый простой способ. Модуль доступен через CPAN.

1
ответ дан 6 December 2019 в 06:37
поделиться

Я считаю, что это должно работать внутри вашего Perl-скрипта.

$SIG{ HUP } = 'IGNORE';

Обратите внимание, что документ на странице руководства для nohup говорит:

Для этого, signal (3) (`` зависание терминальной линии '') игнорировать, затем запускает утилиту вместе с любыми аргументами.

1
ответ дан 6 December 2019 в 06:37
поделиться

Запуск задания в фоновом режиме из оболочки - это нормально, в зависимости от того, сколько ручного труда вы хотите вложить, чтобы убедиться, что оно выполняется постоянно.

Я бы использовал @reboot crontab (а также, возможно, регулярную проверку). Но тогда нужно учесть, что процесс может запускаться несколько раз. Самый простой способ справиться с этим - иметь файл блокировки. Если файл заблокирован, выйдите, иначе продолжайте выполнение задачи. Не забудьте использовать неблокирующие проверки, иначе вы рискуете перегружать ненужные системные ресурсы мертвыми процессами.

screen также можно использовать, если он доступен.

crontab + screen можно объединить.

0
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: