Command-Line

關機命令:如果時間等於或大於 16 分鐘,為什麼不向所有登錄使用者廣播“牆消息”?

  • April 17, 2022

關於man shutdown在:

它表明:

  ...
  The first argument may be a time string (which is usually "now").
  Optionally, this may be followed by a wall message to be sent to
  all logged-in users before going down.
  ...
  Note that to specify a wall message you must specify a time
  argument, too.
  ...

請注意,這篇文章是關於要向所有登錄使用者廣播的牆消息。

因此使用以下模式如下:

shutdown <time> ["something to share"]

其中<time>可以是 +1, … +5, … +15,因此從+1to+15 範圍- 它如下:

shutdown +1 ["something to share"]
...
shutdown +5 ["something to share"]
...
shutdown +15 ["something to share"]

我可以確認登錄的其他使用者接收 - 出現在他們的tty- 廣播消息中(根據情況包括或不包括自定義消息)。因此,正如文件所示,消息是廣播的。直到這裡沒有理由創建這個文章。

情況:原因,我確實意識到 - 如果<time>等於或大於16分鐘 - 通過其中一個使用或者消息不會廣播給他們的. 例如,如果命令返回,那麼就會發生這種情況。當然,如果使用的話,一切都會按預期工作。 +16``hh:mm``tty``date``00:10``shutdown 00:26 ...``shutdown 00:15

問題

  • 如果時間等於或大於 16 分鐘,為什麼不向所有登錄使用者廣播牆消息?- 這是正常的還是錯誤的?

通過man shutdown或者shutdown --help 理論上必須始終向所有登錄使用者廣播牆消息, “從現在” +15、+20 等的時間範圍無關緊要……

注意我在許多虛擬機中都有這種情況 - 對於不同的主機 - 對於 Ubuntu Server 20.04

該資訊隱藏在以下systemd來源中src/login/logind-utmp.c

如果還剩不到 15 分鐘,則立即發出警告(當命令執行時):

/* Warn immediately if less than 15 minutes are left */
if (elapse - n < 15 * USEC_PER_MINUTE) {
       r = warn_wall(m, n);
       if (r == 0)
               return 0;
}

至於其他時間何時發出警告,它是在行動前可能剩餘分鐘數的固定列表

static const int wall_timers[] = {
       0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
       25, 40, 55, 70, 100, 130, 150, 180,
};

因此,例如,如果您執行(-k假冒):

shutdown -k +41 test; sleep 62; shutdown -c

您將在 1 百萬後看到廣播關閉消息,並在 2 秒後將其取消。使用-k +40不會立即發送消息。


的 systemd 變體shutdown(8)僅告訴:

可選地,這可能會在關閉之前發送一條牆消息,以發送給所有登錄的使用者。

它沒有記錄在命令執行或在關閉之前重複(即使是)時將發送此類消息,只是將在 down 之前發送

相比之下,sysvinitshutdown的文件記錄不同,希望實現遵循文件:

-q

減少警告關機顯示的數量。通常關機每 15 分鐘顯示一次警告,然後在倒計時的最後 10 分鐘內每分鐘顯示一次警告,直到時間到。何時-q指定關閉僅在 60 分鐘間隔、10 分鐘標記、5 分鐘標記以及關閉過程實際發生時發出警告。

引用自:https://unix.stackexchange.com/questions/699327