Каково различие между start-stop-daemon и работающий с и?

Довольно легко решить это с крошечным битом Perl. Выберите четыре файла наугад из текущего каталога:

perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4

Поскольку производство использует, хотя, я пошел бы с расширенным сценарием, который не полагается ls вывод, может принять любой dir, проверяет Ваш args, и т.д. Обратите внимание, что сам случайный выбор является все еще только несколькими строками.

#!/usr/bin/perl    
use strict;
use warnings;
use List::Util qw( shuffle );

if ( @ARGV < 2 ) {
    die "$0 - List n random files from a directory\n"
        . "Usage: perl $0 n dir\n";
}
my $n_random = shift;
my $dir_name = shift;
opendir(my $dh, $dir_name) || die "Can't open directory $dir_name: $!";

# Read in the filenames in the directory, skipping '.' and '..'
my @filenames = grep { !/^[.]{1,2}$/ } readdir($dh);
closedir $dh;

# Handle over-specified input
if ( $n_random > $#filenames ) {
    print "WARNING: More values requested ($n_random) than available files ("
          . @filenames . ") - truncating list\n";
    $n_random = @filenames;
}

# Randomise, extract and print the chosen filenames
foreach my $selected ( (shuffle(@filenames))[0..$n_random-1] ) {
    print "$selected\n";
}
18
28.10.2013, 17:21
1 ответ

Фоновое задание (т.е. запустился с и) все еще имеет, это - stdin, stdout и stderr, подключенный к терминалу, в котором это было запущено. Это может внезапно записать (например, сообщения об ошибках) к терминалу ("нарушение" задания на переднем плане) или пауза, ожидающая входа с клавиатуры (необходимо сначала поместить его в передний план). Можно, конечно, перенаправить stdout и stderr в файл или в/dev/null, чтобы препятствовать тому, чтобы фоновое задание писало в терминал.

Фоновое задание может также быть помещено в передний план - например, текущее задание переднего плана останавливается, и fg (приоритетная) команда используется для помещения фонового задания в передний план. Фоновое задание может также быть достигнуто сигналами от терминала - например, SIGHUP при закрытии терминала которые обычно заканчивают (большинство) программы, запущенные в терминале.

Демон - как те запущенные автоматически init.d, но который также может быть запущен вручную с терминала - с другой стороны, выполнения, разъединенные от любых терминалов. Даже если это было вручную запущено с терминала, демон будет разъединен от терминала, таким образом, это не сможет ни записать (stdout, stderr), ни считать (stdin) его. Это также "неуязвимо" для сигналов, отправленных "автоматически" терминалом. (хотя можно отправить сигналы в него при помощи kill -signal pid).

"Фон" и "передний план" относятся к состоянию процесса к некоторому терминалу - является ли это процессом, в настоящее время управляющим терминалом или нет. Так как демоны не подключены к терминалу (но был maticousily, разъединенный от него каждым способом), он, как могут для этого говорить, не работает в фоновом режиме. Демоны являются просто процессами, работающими, не будучи связанным с терминалом - ни одним в носу - или фон.

Если Вы используете ps с опциями, который показывает, который использует терминал процесс, Вы будете видеть, что и нос - и backgroundjobs являются assosciated с терминалом (например, tty2). Демоны, с другой стороны, имейте a"?" в этом поле.

Демоны обычно beahaves как таковой, даже если они запускаются вручную. При создании демона Вас собственный, довольно мало работы - существует некоторый обман, включенный для общего разъединения ее от терминала. Необходимо создать своего собственного пользователя/группу для выполнения как. Необходимо обычно использовать/tmp,/var/tmp или/var/run, если Вы хотите, чтобы он создал файлы - он обычно не должен иметь прав больше нигде. Так как это не может сообщить об ошибках терминалу, у Вас должен быть он, пишут в файл журнала (например, свой собственный файл журнала в/var/log). Демоны должны сделать запись в/var/run с, он - текущий PID и должен проверить, работал ли другой экземпляр его уже. Это должно уважать блокировки (/var/lock) за файлы или устройства когда это применимо. Это должно ответить на SIGHUP путем перезагрузки, это - файлы конфигурации, и используйте обновленные конфигурации.

Другая точка - то, как работает большинство демонов. Демон обычно является единственным исполняемым файлом, который может работать в одном из двух отличных режимов; в зависимости от того, является ли это исходным демоном - родитель - запустился при начальной загрузке или вручную... или ребенок, порожденный этим родителем. Родительский процесс обычно просто сидит и ждет некоторого события - определенное время, время передало, попытка соединиться с определенным сетевым портом, или что когда-либо. Когда это происходит, родитель создает дочерний процесс, идентичный себе (использование ветвления () системный вызов) - и сразу возвращается к ожиданию другого события (и возможно порождение большего количества детей). Это - дочерний процесс, который на самом деле сделает работу - как синхронизация диска, выполняя команду (например. cron) или установите сетевое соединение (например. sshd или ftpd). Единственная разница между родителем и ребенком, то, что они получили другой PIDs и что PPID (Родительский PID) ребенка является PID родительского процесса - это может привыкнуть к удерживанию, является ли процесс родителем или ребенком. Таким образом, тот же процесс должен смочь работать в двух режимах - как ожидание (и порождение) родитель, или как рабочий ребенок.

В то время как не трудно записать демону, это не тривиально ни один - поскольку Вы видите, что существует довольно много "приемов", которые необходимо знать сначала. В целом я думал бы, пишущий, что демон потребует большого усилия для очень небольшого количества усиления по сравнению с другими альтернативами:

Используя nohup или disown на фоновом задании обычно достаточно хорошая альтернатива, поскольку это поддерживает процесс, даже если терминал закрывается. Это часто - хорошая идея перенаправить stdout и stderr в файл или в/dev/null все же. Для более интерактивных программ, screen хороший путь состоит в том, чтобы убрать что-то, пока Вам не нужен он. at, batch и crontab также стоит для рассматривания.

27
27.01.2020, 19:46
  • 1
    Также я помню от своих старых системных курсов Unix, что при запуске от терминала сервер должен также оставить [группой процесса] [en.wikipedia.org/wiki/Process_group]. Насколько я помню. Так, чтобы процесс был неуязвим любой сигнал для своего исходного терминала. –  yves Baumes 28.10.2013, 18:40

Теги

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