ログアウト時に何かをしようとしていますが、タスクが完了するまでに最大5分かかることがあります。
ユーザーがPower off
またはReboot
を直接選択した場合、スクリプトは完了前に強制終了されます。ユーザーがLog out
を選択しただけであれば、スクリプトは問題なく実行されます。
pam_exec
およびlightdm
プロパティsession-cleanup-script
を使用してスクリプトを指すようにしましたが、どちらの場合も同じです。
テストの実行に使用されるスクリプトは次のとおりです。
#!/bin/bash
touch /tmpfile
for p in $(seq 0 300) ; do
sleep 1
echo $p >> /tmpfile
done
ログアウトすると、300個の数字すべてがファイルに書き込まれます。ユーザーセッション内から直接シャットダウンまたは再起動すると、2つまたは3つの数字のみが書き込まれるため、スクリプトは強制終了されます。
Lightdmによるシャットダウンの処理方法スクリプトが強制終了されないようにするにはどうすればよいですか?
別のアプローチを提案する場合は、ログアウトしているユーザーを把握し、そのユーザーとしてスクリプトを実行できるようにする必要があることに注意してください。また、何が起きているのかをユーザーに通知する必要があるので、可能であればXに留まる方が良いでしょう。
Ubuntuでは、/etc/rc[0-6].d
ディレクトリ内の存在に応じて、異なるランレベルのスクリプトが実行されます。 Runlevel 0
はシャットダウンに対応し、6は再起動に対応します。
通常、スクリプトは/etc/init.d
に保存され、その後、必要なランレベルに対応するディレクトリにシンボリックリンクが配置されます。
したがって、あなたの場合、スクリプトを記述して/etc/init.d/
に保存し、/etc/rc0.d
と/etc/rc6.d
の両方にシンボリックリンクを作成します(両方が必要な場合)、スクリプトを指します。
次のようなシンボリックリンクを作成します:/etc/rc0.d/K01myscipt -> /etc/init.d/myscript
各ランレベルディレクトリのスクリプトはASCII順で実行されるため、ランレベル内の順序が重要な場合は、それに応じてシンボリックリンクの名前を選択してください。
それが解決することを願っています。実行可能にすることを忘れないでください(Sudo chmod + x myscript)。また、よくわかりませんが、スクリプトの最初でシャットダウンをキャンセルする必要がある場合があります-shutdown -c now
そして最後に再度発行する必要があります-shutdown -h now
。
知っているように、誰がshutdown
コマンドを発行したか:
1)または、次のようにラッパースクリプトの助けを借りてそれを行うことができます。
a. mv /sbin/shutdown /sbin/shutdown-orig
b. vim /sbin/shutdown #!/bin/sh echo "$USER has initiated the shutdown process" >> /var/log/shutdown.owner /sbin/shutdown-orig "$@"
c. chmod 755 /sbin/shutdown
2)または、通常のユーザーは、shutdown
を介してSudo
コマンドにのみアクセスでき、Sudo
コマンドは(通常)/var/log/
の下に記録されます。だから、あなたはそれを確認することができます。それが役に立てば幸い。詳細については、 my thread here を参照してください。立ち寄って、彼らに感謝を言うことを忘れないでください。
編集:結論、何も機能しない場合は、Sudoを使用してシャットダウン/リブートへのアクセスを遮断してみてください。ログを確認し、誰がシャットダウンプロセスを開始したかを知ることができます。詳細は以下のコンテンツにあります。ありがとう。 Wonderful Question, Learnt a Lot.
LightDM
/etc/rc0.d
にスクリプトを作成します。
Sudo vim /etc/rc0.d/myScript
Sudo chmod +x /etc/rc0.d/myScript
[〜#〜] gdm [〜#〜]
ファイル/etc/gdm/PostSession/Default
のexit 0
行の前にコマンドを追加します。
とにかくシャットダウン前にユーザーがログオフされるので、これは両方のベースをカバーするはずです。