Я отправлю это как ответ так, чтобы было некоторое разрешение, если это оказывается проблемой.
Статус выхода 0 означает нормальный выход из успешной программы. Программа выхода может выбрать любое целое число между 0 и 255 как его статус выхода. Традиционно, программы используют маленькие значения. Значения 126 и выше используются оболочкой для создания отчетов об особых условиях, поэтому лучше избегать их.
На уровне API C программы сообщают о 16-разрядном состоянии ¹, который кодирует и статус выхода программы и сигнал, который уничтожил его, если таковые имеются.
В оболочке, статус выхода команды (сохраненный в $?
) объединяет фактический статус выхода программы и значения сигналов: если программа закрыта сигналом, $?
установлен на значение, больше, чем 128 (с большинством оболочек, это значение 128 плюс число сигнала; ATT ksh использует 256 +, число сигнала и yash используют 384 + число сигнала, которое избегает неоднозначности, но другие оболочки не следовали примеру).
В частности, если $?
0, Ваша программа, из которой выходят обычно.
Обратите внимание, что это включает случай процесса, который получает SIGTERM, но имеет обработчик сигналов для него и в конечном счете обычно выходит (возможно, как косвенное последствие сигнала SIGTERM, возможно, не).
Для ответа на вопрос в заголовке SIGTERM никогда не отправляется автоматически системой. Существует несколько сигналов, которые отправляются автоматически как SIGHUP, когда терминал уходит, SIGSEGV/SIGBUS/SIGILL, когда процесс делает вещи, он не должен делать, SIGPIPE, когда он пишет в поврежденный канал/сокет и т.д. И существует несколько сигналов, которые отправляются из-за нажатия клавиши в терминале, главным образом SIGINT для Ctrl+C, SIGQUIT для Ctrl +\и SIGTSTP для Ctrl+Z, но SIGTERM не является одним из тех. Если процесс получает SIGTERM, некоторый другой процесс отправил тот сигнал.
¹ примерно разговор
Оказывается, что tar GNU создали разность в (-d):
$ #Create the archive and a difference:
$ echo one>file1;echo two>file2;tar -czf archive.tgz file*;echo changing>>file1
$ tar -dzf archive.tgz
file1: Size differs
Если Вы работаете с tar, который не имеет этой попытки:
$ for F in `tar -tzf archive.tgz`;do tar -xzOf archive.tgz $F|diff --brief - $F;done
Files - and file1 differ
Вот новый инструмент: http://diffoscope.org/
Старый инструмент: http://tardiff.sourceforge.net/
\#
для? – AnnanFay 03.10.2012, 20:59#
добавленный. Обратная косая черта является ненужной в большинстве оболочек. – Gilles 'SO- stop being evil' 03.10.2012, 21:05