diff --git a/include/asterisk/_private.h b/include/asterisk/_private.h
index 4f81421f3a255055b7765f347335f7f4e716d970..65e403fb49936994faaadf88fdfdf8095fdf8667 100644
--- a/include/asterisk/_private.h
+++ b/include/asterisk/_private.h
@@ -37,6 +37,7 @@ int ast_term_init(void);		/*!< Provided by term.c */
 int astdb_init(void);			/*!< Provided by db.c */
 int ast_channels_init(void);		/*!< Provided by channel.c */
 void ast_builtins_init(void);		/*!< Provided by cli.c */
+void ast_cli_channels_init(void);	/*!< Provided by cli.c */
 int ast_cli_perms_init(int reload);	/*!< Provided by cli.c */
 void dnsmgr_start_refresh(void);	/*!< Provided by dnsmgr.c */
 int ast_dns_system_resolver_init(void); /*!< Provided by dns_system_resolver.c */
diff --git a/main/asterisk.c b/main/asterisk.c
index 2d70c53abd1fd53c31964655e863793058b9952f..dea849f10c1f0a6fdcd64ebcd9e82fcab0c43e30 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -4269,6 +4269,7 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou
 
 	/* loads the cli_permissions.conf file needed to implement cli restrictions. */
 	ast_cli_perms_init(0);
+	ast_cli_channels_init(); /* Not always safe to access CLI commands until startup is complete. */
 
 	ast_stun_init();
 
diff --git a/main/cli.c b/main/cli.c
index 0c119531a62f848648fc88bd9befe40abe277876..03863358df2028c5a47571fcd1f3c8499f7d406b 100644
--- a/main/cli.c
+++ b/main/cli.c
@@ -2016,50 +2016,27 @@ static char *handle_help(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
 static struct ast_cli_entry cli_cli[] = {
 	AST_CLI_DEFINE(handle_commandmatchesarray, "Returns command matches array"),
 
-	AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"),
-
-	AST_CLI_DEFINE(handle_chanlist, "Display information on channels"),
-
-	AST_CLI_DEFINE(handle_showcalls, "Display information on calls"),
-
-	AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"),
-
-	AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"),
-
 	AST_CLI_DEFINE(handle_debug_category, "Enable/disable debugging categories"),
 
 	AST_CLI_DEFINE(handle_debug, "Set level of debug chattiness"),
 	AST_CLI_DEFINE(handle_trace, "Set level of trace chattiness"),
 	AST_CLI_DEFINE(handle_verbose, "Set level of verbose chattiness"),
 
-	AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"),
-
 	AST_CLI_DEFINE(handle_help, "Display help list, or specific help on a command"),
-
 	AST_CLI_DEFINE(handle_logger_mute, "Toggle logging output to a console"),
 
 	AST_CLI_DEFINE(handle_modlist, "List modules and info"),
-
 	AST_CLI_DEFINE(handle_load, "Load a module by name"),
-
 	AST_CLI_DEFINE(handle_reload, "Reload configuration for a module"),
-
 	AST_CLI_DEFINE(handle_core_reload, "Global reload"),
-
 	AST_CLI_DEFINE(handle_unload, "Unload a module by name"),
-
 	AST_CLI_DEFINE(handle_refresh, "Completely unloads and loads a module by name"),
 
 	AST_CLI_DEFINE(handle_showuptime, "Show uptime information"),
 
-	AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"),
-
 	AST_CLI_DEFINE(handle_cli_reload_permissions, "Reload CLI permissions config"),
-
 	AST_CLI_DEFINE(handle_cli_show_permissions, "Show CLI permissions"),
-
 	AST_CLI_DEFINE(handle_cli_check_permissions, "Try a permissions config for a user"),
-
 	AST_CLI_DEFINE(handle_cli_wait_fullybooted, "Wait for Asterisk to be fully booted"),
 
 #ifdef HAVE_MALLOC_TRIM
@@ -2068,6 +2045,16 @@ static struct ast_cli_entry cli_cli[] = {
 
 };
 
+static struct ast_cli_entry cli_channels_cli[] = {
+	AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"),
+	AST_CLI_DEFINE(handle_chanlist, "Display information on channels"),
+	AST_CLI_DEFINE(handle_showcalls, "Display information on calls"),
+	AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"),
+	AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"),
+	AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"),
+	AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"),
+};
+
 /*!
  * Some regexp characters in cli arguments are reserved and used as separators.
  */
@@ -2239,6 +2226,11 @@ static void cli_shutdown(void)
 	ast_cli_unregister_multiple(cli_cli, ARRAY_LEN(cli_cli));
 }
 
+static void cli_channels_shutdown(void)
+{
+	ast_cli_unregister_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli));
+}
+
 /*! \brief initialize the _full_cmd string in * each of the builtins. */
 void ast_builtins_init(void)
 {
@@ -2247,6 +2239,12 @@ void ast_builtins_init(void)
 	ast_register_cleanup(cli_shutdown);
 }
 
+void ast_cli_channels_init(void)
+{
+	ast_cli_register_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli));
+	ast_register_cleanup(cli_channels_shutdown);
+}
+
 /*!
  * match a word in the CLI entry.
  * returns -1 on mismatch, 0 on match of an optional word,