Строка хижины (от “резкого удара”, т.е. #!
) обрабатывается ядром. Ядро не хочет знать о переменных среды такой как PATH
. Таким образом, имя на строке хижины должно быть полным путем к исполняемому файлу. Можно также указать дополнительный аргумент для передачи тому исполняемому файлу перед названием сценария (с системно-зависимыми ограничениями, в которые я не войду здесь). Например, для сценария Python, можно указать
#!/usr/bin/python
на первой строке, и когда Вы выполните сценарий, на самом деле выполнится ядро /usr/bin/python /path/to/script
. Но это не удобно: необходимо указать полный путь команды. Что, если Вы имеете python
в /usr/bin
на некоторых машинах и /usr/local/bin
на других? Или Вы хотите установить Ваш PATH
кому: /home/joe/opt/python-2.5/bin
чтобы использовать определенную версию Python? Так как ядро не сделает PATH
поиск для Вас, идея состоит в том, чтобы заставить ядро выполнить команду, которая по очереди ищет желаемый интерпретатор в PATH
:
#!/fixed/path/to/path-lookup-command python
Это path-lookup-command
должен взять название исполняемого файла как аргумент и искать его в PATH
и выполните его: ядро будет работать /fixed/path/to/path-lookup-command python /path/to/script
. Как это происходит, env
команда делает просто это. Его основная цель состоит в том, чтобы выполнить команду с другой средой, но так как она ищет название команды в $PATH
, это идеально подходит для нашей цели здесь.
Хотя это официально не гарантируется, исторические обеспеченные системы Unix env
в /usr/bin
, и современные системы сохранили то местоположение точно из-за широкого использования #!/usr/bin/env
. Так, на практике способ указать, что сценарий должен быть выполнен любимым интерпретатором Python пользователя,
#!/usr/bin/env python
Ответ Frederik, вовлекающий волшебный SysRq и дампы ядра, будет работать, если ядро будет все еще работать, и не действительно подвешенное. Ядро могло бы просто быть занятым цикличным выполнением по некоторым причинам.
То, что это не отвечает на Ctrl-Alt-Del, говорит мне, который, вероятно, не имеет место, и что машина запирается трудно. Это означает отказ оборудования или что-то тесно связанное, как плохой драйвер.
Ваше контрольное испытание памяти хорошо, если Вы позволяете ему работать достаточно долго. Необходимо также попробовать другие вещи попытаться подчеркнуть систему, как StressLinux. Продолжительные сравнительные тесты хороши, также.
Другая вещь попробовать загружает систему с Ubuntu живой CD и пытается использовать систему в качестве нормальной. Если возврат Ubuntu временно как этот не заставляет проблему повторяться, существует хороший шанс, это на самом деле не повредило аппаратные средства, но одну из связанных вещей как плохой драйвер или неправильно настроило ядро. Довольно возможно, что более популярное распределение как Ubuntu могло иметь более стабильную конфигурацию ядра, чем одна как Arch, просто из-за большего количества машин, это было испытано во время фазы тестирования дистрибутива.
Относительно замораживания существует несколько опций:
использование последовательного порта, если поле имеет для получения дампа там путем добавления console=ttyS0
к параметрам загрузки, как описано здесь. Вам нужны вторая машина с последовательным портом и нуль-модемный кабель для ловли файла дампа.
с помощью netconsole для получения дампа по сети посмотрите здесь.
Используя kexec/kdump таким образом Вы получаете локальный дамп, видите здесь.
Относительно чистой энергии от проблемы я предлагаю, чтобы Вы использовали волшебный ключ SysRq к 'S'ync диски, 'U'mount их, и затем re'B'oot поле (буквы - те, необходимо ввести наряду с alt-sysrq.
Править: При регистрации ООП/трассировки на lkml необходимо использовать недавнее (предпочтительно последнее) версия ядра и никаких собственных модулей.
ctrlaltdel hard
в Вашем/etc/rc.local
файл. Когда система запрется, попробуйте Ctrl-Alt-Del. Если это все еще ничего не делает, Вы знаете наверняка, что ядро больше не работает; у Вас есть отказ аппаратных средств или драйвера. – Warren Young 23.03.2011, 15:04