web-dev-qa-db-ja.com

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-screenの使用中にもポップアップします。ログアウトする前にGNU-screenセッション内でls -al $HOMEを実行すると、次のようになります。

command before log out

GNU-screenセッションから切り離し、ログアウトしてログインし、screenセッションに再接続して、画面内にアクセスしていたファイルにアクセスできなくなったことを確認しました。 ls -al $HOMEの出力は現在

command after log out

興味をそそられますね。

4
vari

それは認証と同じです。

チケットとトークンに関するいくつかの概念と、Kerberos認証システムとAFSがそれらをどのように使用するかから始めます。最終的に、私の質問に対する答えは明確になります。ログアウト時にAFSトークンが削除されたという理由だけで、ファイルに書き込むことは許可されていません。そうは言っても、私の問題の解決策は、トークンが存在するかどうかを判断する数行をmatlabスクリプトに含めることでした。トークンが存在しない場合は、トークンを作成します。これがどのように行われたかが答えを正確に結論付けます。

認証

どこからでもアクセス可能な分散ファイルシステムを提供することは、堅牢なセキュリティシステムを意味します。これが、AFSがKerberos認証システムと統合された強力な認証システムを備えている理由です。

AFSでの認証は、トークンを使用して解決されます。トークンは、ユーザーが存続期間中にデータにアクセスできるようにします。多くの場合、トークンの処理はシームレスであり、ユーザーの介入は必要ありません。ただし、ユーザーはいつでも、tokensを使用してその名前で発行されたトークンを一覧表示できます。

username@machine00 ~ $ tokens

Tokens held by the Cache Manager:

User's (AFS ID xxxxx) tokens for [email protected] [Expires Mar 20 05:10]
   --End of list--

AFSトークンは、Kerberos識別子チケットから取得されます。トークンと同様に、Kerberosチケットもユーザーを識別します。 Kerberos認証システムを使用している間、ユーザーはKDC(Key Distribution Center)によってチケット許可チケットと呼ばれる初期チケットを発行されます。この最初のチケットはユーザーを一意に識別し、AFSトークンなどの追加サービスに必要な特定のチケットを取得できるようにします。実際、AFSサービスのKerberosチケットにはAFS識別トークンが含まれているため、直接使用できます。

ほとんどの場合、Kerberosのチケット許可チケットは、ユーザーのログイン時に自動的に取得されます。 AFS初期トークンでも同じことが起こります。トークンと同様に、Kerberosチケットの処理はほとんどの場合ユーザーには表示されませんが、klistを使用して発行されたチケットを一覧表示できます。

username@machine00 ~ $ klist
Credentials cache: FILE:/tmp/krb5cc_V16088
        Principal: [email protected]

  Issued           Expires          Principal                 
Mar 19 19:10:11  Mar 20 05:10:11  krbtgt/[email protected]
Mar 19 19:10:11  Mar 20 05:10:11  afs/[email protected]   
username@machine00 ~ $

資格情報キャッシュは、チケットが見つかったファイルの場所です。プリンシパルはユーザーIDであり、基本的にユーザー名とKerberosのレルムドメインの組み合わせから生じます。 Kerberosレルムは通常大文字で指定され、大文字と小文字が区別されることに注意してください。以下に、発行されたチケットのリストと、対応する発行日および有効期限があります。この場合、最初のチケット(krtbg)はレルムKERBEROS.REALM.DOMAINのチケット許可チケットに対応し、2番目のチケットはafsセルyour.system.domainのAFSトークンに対応します(通常はそれが見つかるドメインと同じ名前を持っています)。他のKerberosチケットは、要求された場合にリストに表示される場合があります。

トークンの更新

AFSトークンの有効期限が切れると、AFSアカウントにアクセスできなくなります。このようなイベントが発生した場合の症状はOSによって異なりますが、Unix/Linuxでは通常、ファイルにアクセスしようとすると、アクセス許可が拒否されたというメッセージが表示されます。

username@machine00 ~ $ ls
ls: .: Permission denied

トークンの有効期限が切れたら、トークンを更新する必要があります。ほとんどの場合、トークンの更新はログイン時に自動的に行われるため、これを行う簡単な方法は、ログアウトして再度ログインすることです。しかし、特に、終了したくないものを実行している場合は、ログアウトできないことがあります。

チケット更新の代替ソリューションは、kinitaklogを順番に使用することです。パスワードを必要とするこれらのコマンドの最初のコマンド(kinit)を使用すると、ユーザーの再認証とチケット付与チケットの更新が可能になります。次に、aklogコマンドを使用すると、KerberosチケットからAFSトークンを取得できます。 kinitがデフォルトのプリンシパルとレルムのチケットを取得しようとしていることに注意してください。これらが定義されていない場合、またはチケット要求時にユーザーが別のユーザー名を使用している場合は、たとえば、kinitkinit <principal>@<realm>として使用する必要があります。

username@machine00 ~ $ kinit [email protected]
[email protected]'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 [email protected] <<< "password"';
   unix  aklog
end

私が言ったように、これはmatlabスクリプトに入り、saveまたはloadmatlabコマンドの直前に配置しました。このコードは、matlabコマンドunixを使用して、Unixシェルで引数を実行し、結果を返します。 Unixコマンドklist -sklistをサイレントに実行しますが、終了ステータスを返します。資格情報の終了ステータスをテストし、資格情報が存在しないか期限切れになった場合に新しい資格情報を要求します。

2
vari