<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>apachectl - Apache HTTP Server Control Interface - Apache HTTP Server Version 2.4</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>

<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
<p class="apache">Apache HTTP Server Version 2.4</p>
<img alt="" src="../images/feather.png" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Programs</a></div><div id="page-content"><div id="preamble"><h1>apachectl - Apache HTTP Server Control Interface</h1>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/programs/apachectl.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/programs/apachectl.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
<a href="../ko/programs/apachectl.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="../tr/programs/apachectl.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
</div>

     <p><code>apachectl</code> is a front end to the Apache HyperText
     Transfer Protocol (HTTP) server.  It is designed to help the
     administrator control the functioning of the Apache
     <code class="program"><a href="../programs/httpd.html">httpd</a></code> daemon.</p>

     <p>The <code>apachectl</code> script can operate in two modes.
     First, it can act as a simple front-end to the <code class="program"><a href="../programs/httpd.html">httpd</a></code>
     command that simply sets any necessary environment variables and
     then invokes <code class="program"><a href="../programs/httpd.html">httpd</a></code>, passing through any command line
     arguments.  Second, <code>apachectl</code> can act as a SysV init
     script, taking simple one-word arguments like <code>start</code>,
     <code>restart</code>, and <code>stop</code>, and translating them
     into appropriate signals to <code class="program"><a href="../programs/httpd.html">httpd</a></code>.</p>

     <p>If your Apache installation uses non-standard paths, you will
     need to edit the <code>apachectl</code> script to set the
     appropriate paths to the <code class="program"><a href="../programs/httpd.html">httpd</a></code> binary.  You can also
     specify any necessary <code class="program"><a href="../programs/httpd.html">httpd</a></code> command line arguments.
     See the comments in the script for details.</p>

     <p>The <code>apachectl</code> script returns a 0 exit value on
     success, and &gt;0 if an error occurs.  For more details, view
     the comments in the script.</p>
</div>
<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#synopsis">Synopsis</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#options">Options</a></li>
</ul><h3>See also</h3><ul class="seealso"><li><a href="../invoking.html">Starting Apache</a></li><li><a href="../stopping.html">Stopping Apache</a></li><li><a href="../configuring.html">Configuration Files</a></li><li><a href="../platform/">Platform Docs</a></li><li><code class="program"><a href="../programs/httpd.html">httpd</a></code></li><li><a href="#comments_section">Comments</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="synopsis" id="synopsis">Synopsis</a></h2>

<p>When acting in pass-through mode, <code>apachectl</code> can take
all the arguments available for the <code class="program"><a href="../programs/httpd.html">httpd</a></code>
binary.</p>

<p><code><strong>apachectl</strong> [ <var>httpd-argument</var> ]</code></p>

<p>When acting in SysV init mode, <code>apachectl</code> takes simple,
one-word commands, defined below.</p>

<p><code><strong>apachectl</strong> <var>command</var></code></p>

</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="options" id="options">Options</a></h2>

<p>Only the SysV init-style options are defined here.  Other arguments
are defined on the <code class="program"><a href="../programs/httpd.html">httpd</a></code> manual page.</p>

<dl>

<dt><code>start</code></dt>

<dd>Start the Apache <code class="program"><a href="../programs/httpd.html">httpd</a></code> daemon.  Gives an error if it
is already running.  This is equivalent to <code>apachectl -k
start</code>.</dd>

<dt><code>stop</code></dt>

<dd>Stops the Apache <code class="program"><a href="../programs/httpd.html">httpd</a></code> daemon.  This is equivalent to
<code>apachectl -k stop</code>.</dd>

<dt><code>restart</code></dt>

<dd>Restarts the Apache <code class="program"><a href="../programs/httpd.html">httpd</a></code> daemon.  If the daemon is
not running, it is started.  This command automatically checks the
configuration files as in <code>configtest</code> before initiating
the restart to make sure the daemon doesn't die.  This is equivalent
to <code>apachectl -k restart</code>.</dd>

<dt><code>fullstatus</code></dt>

<dd>Displays a full status report from <code class="module"><a href="../mod/mod_status.html">mod_status</a></code>.
For this to work, you need to have <code class="module"><a href="../mod/mod_status.html">mod_status</a></code> enabled
on your server and a text-based browser such as <code>lynx</code>
available on your system.  The URL used to access the status report
can be set by editing the <code>STATUSURL</code> variable in the
script.</dd>

<dt><code>status</code></dt>

<dd>Displays a brief status report.  Similar to the
<code>fullstatus</code> option, except that the list of requests
currently being served is omitted.</dd>

<dt><code>graceful</code></dt>

<dd>Gracefully restarts the Apache <code class="program"><a href="../programs/httpd.html">httpd</a></code> daemon.  If the
daemon is not running, it is started.  This differs from a normal
restart in that currently open connections are not aborted.  A side
effect is that old log files will not be closed immediately.  This
means that if used in a log rotation script, a substantial delay may
be necessary to ensure that the old log files are closed before
processing them.  This command automatically checks the configuration
files as in <code>configtest</code> before initiating the
restart to make sure Apache doesn't die.  This is equivalent to
<code>apachectl -k graceful</code>.</dd>

<dt><code>graceful-stop</code></dt>

<dd>Gracefully stops the Apache <code class="program"><a href="../programs/httpd.html">httpd</a></code> daemon.
This differs from a normal stop in that currently open connections are not
aborted.  A side effect is that old log files will not be closed immediately.
This is equivalent to <code>apachectl -k graceful-stop</code>.</dd>

<dt><code>configtest</code></dt>

<dd>Run a configuration file syntax test. It parses the configuration
files and either reports <code>Syntax Ok</code>
or detailed information about the particular syntax error.  This is
equivalent to <code>apachectl -t</code>.</dd>

</dl>

<p>The following option was available in earlier versions but has been removed.</p>

<dl>

<dt><code>startssl</code></dt>

<dd>To start <code class="program"><a href="../programs/httpd.html">httpd</a></code> with SSL support, you should edit
your configuration file to include the relevant directives and then
use the normal <code>apachectl start</code>.</dd>

</dl>

</div></div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/programs/apachectl.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/programs/apachectl.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
<a href="../ko/programs/apachectl.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="../tr/programs/apachectl.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div>
<script type="text/javascript"><!--//--><![CDATA[//><!--
var comments_shortname = 'httpd';
var comments_identifier = 'http://httpd.apache.org/docs/2.4/programs/apachectl.html';
(function(w, d) {
    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
        d.write('<div id="comments_thread"><\/div>');
        var s = d.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
    }
    else { 
        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
    }
})(window, document);
//--><!]]></script></div><div id="footer">
<p class="apache">Copyright 2023 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
//--><!]]></script>
</body></html>