回答:
at 18:00 shutdown now「at」ジョブを作成します。これは、システムに応じて、指定された時間にatデーモンまたはcronデーモンによって実行されます。
shutdown 18:00指定された時間まで待機してからシャットダウンを実行するシェル内のプロセスを開始します。このコマンドは、たとえばシェルセッションが終了した場合に終了できます。
ほとんどの場合、最終的な結果は同じです。システムは18:00にシャットダウンされます。
違いの1つは、を使用するatとジョブが保存され、18:00より前にシステムが他の何らかの手段でシャットダウンされた場合、再起動時にジョブが実行待ちになることです。時間がすでに経過している場合、シャットダウンはすぐに実行されますが、これは非常に予期しないことです。
もう1つの違いは、スケジュールされた時刻の5分前にファイルshutdown 18:00を作成して、/run/nologinその瞬間以降にユーザーがログインしないようにすることです。また、システムがシャットダウンされようとしていることをログインユーザーに警告するために、ブロードキャストメッセージが送信されます。
これらの違いを考慮して、どちらを使用するかを決定する必要があります。
nohupするdisownかどうかに関係なく、通常ログアウトすると実行中のバックグラウンドプロセスが強制終了される場合です。システムごとに異なるデフォルトを設定できます。(実際にはsudo shutdownまだ実行中のプロセスがあると仮定します。むしろinit、シャットダウンタイマーを開始するように通知するだけです。後者は実際に起こることかもしれませんが、最近チェックしていません。ああ、@ JdeBPが持っています。 )
at経由で動作するように設定することは本当に可能ですか?cronatd
CentOS 7を使用している場合、systemdオペレーティングシステムを使用しているため、答えは異なります。
at 18:00 shutdown nowatサブシステムを介してスケジュールを設定しますが、そのshutdownコマンドは、で直接呼び出すコマンドshutdown 18:00とは異なります。実際にはsystemdのsystemctlプログラムです。 systemctl物事のやり方が異なります。
まず最初にsystemctl、スケジュールされたシャットダウン要求を送信して、デーモンと同様に処理しatます。ただし、これは、特にサブシステムではなく、systemdデーモンですlogind(systemd-shutdownd2015年5月にsystemdから削除されたこのデーモンは、それ以降のマイナーバージョンのCentOS 7に浸透していatます)。 systemctl内部プロトコルを(システム全体の)Desktop Busブローカーに伝えます。DesktopBusブローカーはと通信しlogindます。
したがって、atケースのように、shutdownカウントダウンしてwallメッセージを生成するプロセスはありません。そのため、ログアウトできますが、これはスケジュールに影響を与えません。キャンセルは、ログインセッションのフォアグラウンドプロセスを単に中断/終了するほど簡単ではありません。と同じようにat。
ケースとは異なり、まだメッセージがありますatが、それらはによって発行されlogindます。また、atケースとは異なり、スケジュールされたジョブはシステムの再起動後も保持されないため、実際のシャットダウンはスケジュールされたジョブをキャンセルします。そこで、ファイルシステム内のファイルは、それが下にある/run/systemd/shutdown非永続ストレージです。
さらに異なるのは、一度に1つのシャットダウンしかスケジュールできないことです。一方、複数のatジョブを送信できます。ポリシーキットはshutdown、非ログインセッションコンテキストで実行するルールを、実行に適用されるルールatとは異なるジョブとして適用しshutdownます。ログインセッションコンテキスト。後者はより寛容で、アクティブなログインセッションにログインしている非特権ユーザーがシステムをシャットダウンできるようにします。
shutdown 18:00シェルで待機するプロセスを開始します」。それ以前にログアウトした場合はどうなりますか?