nohup で起動されたコマンドが、ユーザーのログアウト後にファイルを書き込むことができないのはなぜですか?

nohup で起動されたコマンドが、ユーザーのログアウト後にファイルを書き込むことができないのはなぜですか?

私は、matlab を起動し、いくつかの指定されたファイルの読み取りと書き込みを必要とするスクリプトを実行するために nohup を使用しています。

nohup matlab -nojvm -nodisplay -r 'MyScript'&

ログインしている間はスムーズに実行されますが、ログアウトして再度ログインすると、matlab プロセスが実行されていないことがわかります。nohup.out ファイルを確認すると、次のエラー メッセージが見つかりました。

Unable to write file $HOME/matlab/my_mat_file.mat: permission denied

ログアウトするとすぐに、matlab プロセスの所有者が変わり、ファイルにアクセスできなくなるようです。ファイルのアクセス許可を変更せずに (たとえば、全員に書き込みアクセス許可を付与するなど)、このエラーが発生しないようにするにはどうすればよいですか?

このエラーメッセージはGNU-screenを使用しているときにも表示されます。ls -al $HOMEログアウトする前にGNU-screenセッション内で実行すると、

ログアウト前のコマンド

GNU-screenセッションから切り離し、ログアウトし、ログインし、screenセッションに再度接続したところ、screen内でアクセスできたファイルにアクセスできなくなっていました。出力は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 [email protected] [Expires Mar 20 05:10]
   --End of list--

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

ほとんどの場合、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 セルの AFS トークンに対応しますyour.system.domain(通常、これは見つかるドメインと同じ名前です)。他の Kerberos チケットが要求された場合は、リストに表示されることがあります。

トークンの更新

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

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

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

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

username@machine00 ~ $ kinit [email protected]
[email protected]'s Password: 
username@machine00 ~ $

の反対は でaklogunlogAFS トークンを削除します。同様に、 は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

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

関連情報