Почему команда, запущенная с nohup, не может записать файл после выхода из системы?
Я использую nohup для запуска matlab и запуска скрипта, который требует чтения и записи некоторых файлов.
nohup matlab -nojvm -nodisplay -r 'MyScript'&
Это происходит гладко, пока я вхожу в систему, но как только я выхожу и снова вхожу, я вижу, что мой процесс Matlab больше не работает. После проверки файла nohup.out я нахожу следующее сообщение об ошибке:
Unable to write file $HOME/matlab/my_mat_file.mat: permission denied
Похоже, что, как только я выхожу из системы, владелец процесса matlab меняется, и он больше не имеет доступа к моим файлам. Как я могу предотвратить возникновение этой ошибки без изменения прав доступа к файлу, например, путем предоставления разрешений на запись для всех?
Это сообщение об ошибке также появляется при использовании GNU-экрана. Если я бегу ls -al $HOME
в моем сеансе экрана GNU, прежде чем выйти из системы, у меня будет
Я отсоединяюсь от сеанса экрана GNU, выхожу из системы, регистрируюсь и снова присоединяюсь к сеансу экрана только для того, чтобы обнаружить, что я потерял доступ к файлам, к которым у меня был доступ к внутреннему экрану. Выход из ls -al $HOME
сейчас
Интригующе, не правда ли?
1 ответ
Это как делать с аутентификацией.
Я начну с некоторых понятий о билетах и токенах и о том, как их использует система аутентификации Kerberos и AFS. К концу ответ на мой вопрос будет ясен, мне не разрешено писать в файл просто потому, что мой токен AFS был удален при выходе из системы. Тем не менее, решение моей проблемы заключалось в том, чтобы включить в сценарий matlab несколько строк, которые определяют, существует ли токен или нет, если он не создается. Как это было сделано, точно завершает ответ.
Аутентификация
Предоставление распределенной файловой системы, доступной в любом месте, подразумевает надежную систему безопасности. Вот почему AFS имеет строгую систему аутентификации, интегрированную с системой аутентификации Kerberos.
Аутентификация в AFS решается с помощью токена. Токены предоставляют пользователям доступ к данным в течение их жизненного цикла. Во многих случаях обработка токенов проходит гладко, не требуя вмешательства пользователя. Однако пользователь может в любой момент перечислить токены, выпущенные от его имени, используя tokens
username@machine00 ~ $ tokens
Tokens held by the Cache Manager:
User's (AFS ID xxxxx) tokens for afs@your.system.domain [Expires Mar 20 05:10]
--End of list--
Токены AFS получены из идентификационного билета Kerberos. Аналогично токенам билеты Kerberos также идентифицируют пользователя. При использовании системы аутентификации Kerberos пользователю выдается KDC (Центр распространения ключей) первоначальный билет, называемый билетом на выдачу билетов. Этот первый билет однозначно идентифицирует пользователя и позволяет ему получить специальные билеты, необходимые для дополнительных услуг, таких как токены AFS. На самом деле, вы можете напрямую использовать билет Kerberos для службы AFS, имеющей идентификационный токен AFS.
В большинстве случаев билет Kerberos для выдачи билетов автоматически получается при входе пользователя. То же самое происходит с начальным токеном AFS. Как и токены, обработка билетов Kerberos в большинстве случаев невидима для пользователя, но вы можете получить список выданных билетов, используя klist
username@machine00 ~ $ klist
Credentials cache: FILE:/tmp/krb5cc_V16088
Principal: username@KERBEROS.REALM.DOMAIN
Issued Expires Principal
Mar 19 19:10:11 Mar 20 05:10:11 krbtgt/KERBEROS.REALM.DOMAIN@KERBEROS.REALM.DOMAIN
Mar 19 19:10:11 Mar 20 05:10:11 afs/your.system.domain@KERBEROS.REALM.DOMAIN
username@machine00 ~ $
Кэш учетных данных - это местоположение файла, в котором находятся билеты. Принципал - это идентификатор пользователя, который в основном является результатом сочетания имени пользователя и домена области Kerberos. Обратите внимание, что область Kerberos обычно указывается в верхнем регистре и чувствительна к регистру. Далее у нас есть список выпущенных билетов, с соответствующими датами выдачи и сроком действия. В этом случае первый билет (krtbg
) соответствует выдаче билетов на царство KERBEROS.REALM.DOMAIN
в то время как второй соответствует токену AFS на ячейке afs your.system.domain
(имя которого обычно совпадает с именем домена, в котором оно может быть найдено). Другие билеты Kerberos могут появиться в списке в случае, если они были запрошены.
Обновление токена
По истечении срока действия токена AFS доступ к учетной записи AFS становится невозможным. Признаки того, что такое событие имеет место, варьируются от ОС к ОС, однако в Unix/Linux вы обычно получаете сообщение об отказе в доступе при попытке доступа к вашим файлам:
username@machine00 ~ $ ls
ls: .: Permission denied
Когда токен истекает, вам нужно его обновить. Самый простой способ сделать это - выйти из системы и войти снова, так как в большинстве случаев обновление токена происходит автоматически при входе в систему. Но оказывается, что иногда выход из системы невозможен, особенно если вы запускаете что-то, что не хотите выходить, что имеет место.
Альтернативное решение для возобновления билета использует kinit
а также aklog
, по порядку. Первая из этих команд (kinit
), который требует ваш пароль, разрешает повторную аутентификацию пользователя и продление билета. Следующий, aklog
Команда позволяет получить токен AFS из билета Kerberos. Заметить, что kinit
пытается получить билет для основного участника и области по умолчанию. В случае, если они не определены, или если пользователь использует другое имя пользователя во время запроса билета, kinit
следует использовать как kinit <principal>@<realm>
, например:
username@machine00 ~ $ kinit username@KERBEROS.REALM.DOMAIN
username@KERBEROS.REALM.DOMAIN's Password:
username@machine00 ~ $
Противоположно aklog
является unlog
, который удаляет токен AFS. Соответственно, kdestroy
удаляет файл заявок, удаляя все билеты Kerberos.
Как это спасло день и помогло мне полюбить своих друзей и семью
Как было сказано в начале, знание об этих концепциях помогло мне лучше понять, что происходит с моим сеансом Matlab. После выхода из системы моего токена AFS больше не было, и у моих запущенных процессов больше не было разрешения на запись в мой том afs. Поскольку на данный момент меня интересует только то, чтобы мой скрипт Matlab продолжал чтение и запись файлов даже после выхода из системы, я осторожно включил тест на токен AFS перед любым доступом к тому AFS.
ticket_status = unix('klist -s');
if ticket_status ~= 0,
unix 'kinit username@KERBEROS.REALM.DOMAIN <<< "password"';
unix aklog
end
Как я уже сказал, это входит в сценарий Matlab, и я поместил его перед любой save
или же load
команды MATLAB. Код использует команду Matlab unix
запустить свои аргументы в оболочке Unix и вернуть результаты. Команда Unix klist -s
работает klist
тихо, но возвращает свой статус выхода. Мы проверяем состояние выхода для учетных данных и запрашиваем новые в случае, если они не существуют или истек срок их действия.