{"id":12772,"date":"2019-12-18T19:16:04","date_gmt":"2019-12-18T18:16:04","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/"},"modified":"2025-10-24T09:32:10","modified_gmt":"2025-10-24T07:32:10","slug":"a-ruthless-repository-shutdown-utility","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/","title":{"rendered":"A Ruthless Repository Shutdown Utility, Part I"},"content":{"rendered":"<p>You have finally completed that migration and need to restart all the Documentum processes. So, you shut down the docbroker and move on to the repositories but then you receive an error message about them not being reachable any more. Or conversely, you want to start all the Documentum processes and you start first the repositories and later the docbrokers. Next, you want to connect to one repository and you receive the same error message. Of course, you finally remember, since the docbroker is a requirement for the repositories, it must be started first and shut down last but it is too late now. How to get out if this annoying situation ? You could just (re)start the docbroker and wait for the next repostories&#8217; checkpoint, at most 5 minutes by default. If this is not acceptable, at first sight, there is no other solution than to &#8220;kill -9&#8221; the repositories&#8217; processes, start the docbroker and only next the repositories. Let&#8217;s see if we can find a better way. Spoiler alert: to stop this insufferable suspens, I must say up front that there is no other way, sorry, but there are a few ways to alleviate this inconvenience.<\/p>\n<h2>A quick clarification<\/h2>\n<p>Let&#8217;s first clarify a point of terminology here: there is a difference between docbases\/repositories and content servers. A docbase encompasses the actual content and their persistent data and technical information whereas the content server is the set of running processes that give access to and manage one docbase. It is very similar to Oracle&#8217;s databases and instances, where one database can be served by several instances, providing parallelism and high availability. A docbase can be served by more than one content server, generally spread over different machines, with its own set of dm_start_<em>docbase<\/em> and dm_shutdown_<em>docbase<\/em> scripts and server.ini. A docbase knows how many content servers use it because they each have their own dm_server_config object. If there is just one content server, both docbase and content server can be used interchangeably but when there are several content servers for the same docbase, when one says &#8220;stopping the docbase&#8221; it really means &#8220;stopping one particular content server&#8221;, and this is the meaning that will be used in the rest of the article. If the docbase has more than one content servers, just extend the presented manipulations to each of them.<\/p>\n<h2>Connecting to the repositories without a docbroker<\/h2>\n<p>If one could connect to a repository without a running docbroker, the situation that triggered this article, things would be much easier. In the ancient, simpler times, the dmcl.ini parameters below could help working around an unavailable docbroker:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: []\">\n[DOCBROKER_DEBUG]\ndocbase_id = &lt;id of docbase as specified in its server.ini file&gt;\nhost =  &lt;host's name the docbase server is running on&gt;\nport = &lt;docbase's port as specified in \/etc\/services&gt;\nservice = &lt;docbase's service name as specified in \/etc\/services&gt;\n<\/pre>\n<p>and they used to work.<br \/>\nAfter the switch to the dfc.properties file, those parameters were renamed as follows:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: []\">\ndfc.docbroker.debug.docbase_id=&lt;id of docbase as specified in its server.ini file&gt;\ndfc.docbroker.debug.host=&lt;host's name the docbase server is running on&gt;\ndfc.docbroker.debug.port=&lt;docbase's port as specified in \/etc\/services&gt;\ndfc.docbroker.debug.service=&lt;docbase's service name as specified in \/etc\/services&gt;\n<\/pre>\n<p>Unfortunately, they don&#8217;t work any more. Actually, although they are still documented in the dfcfull.properties, they have not been implemented and will never be according to OTX. Moreover, they will be removed in the future. Too bad, that would have been such a cheap way to extricate oneself from an uncomfortable situation.<\/p>\n<h2>Preventing the situation<\/h2>\n<p>The best solution is obviously to prevent it to happen. This can be easily realized by using a central script for stopping and starting the Documentum stack. And, while we are at it, inquiring its status.<br \/>\nDocumentum already provides such a script, e.g. see here <a title=\"Linux scripts for automatic startup and shutdown of Documentum Content Server\" href=\"https:\/\/knowledge.opentext.com\/knowledge\/cs.dll\/kcs\/kbarticle\/view\/KB6775251\" target=\"_blank\" rel=\"noopener noreferrer\">Linux scripts for automatic startup and shutdown of Documentum Content Server<\/a>. Here is another more sophisticated implementation:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,110]\">\n#!\/bin\/bash\n#\n# See Usage() function below for explanations; \n# cec - dbi-services - April 2019\n#\n\ngeneral_status=0\n\nUsage() {\n   cat &lt;&lt;EoU\nUsage:\n    start-stop.sh [(help) | start | stop | status] [(all) | docbases | docbrokers | docbase={,} | docbroker={,} | method_server]\n E.g.:\n    display this help screen:\n       start-stop.sh\n    start all:\n       start-stop.sh start [all]\n    stop all:\n       start-stop.sh stop [all]\n    status all:\n       start-stop.sh status [all]\n    start docbroker01:\n       start-stop.sh start docbroker=docbroker01\n    start docbases global_registry and dmtest01:\n       start-stop.sh docbase=global_registry,dmtest01\n    start all the docbases:\n       start-stop.sh docbases\n    start all the docbrokers:\n       start-stop.sh docbrokers\nEoU\n}\n\nstart_docbroker() {\n   docbroker=$1\n   echo \"starting up docbroker $docbroker ...\"\n   .\/dm_launch_${docbroker}\n}\n\nstart_all_docbrokers() {\n   echo \"starting the docbrokers ...\"\n   DOCBROKERS=`ls -1 dm_launch_* 2&gt;\/dev\/null | cut -f3 -d_`\n   nb_items=0\n   for docbroker in $DOCBROKERS; do\n      start_docbroker $docbroker\n      (( nb_items++ ))\n   done\n   echo \"$nb_items docbrokers started\"\n\n}\n\nstart_docbase() {\n   docbase=$1\n   echo \"starting $docbase\"\n   .\/dm_start_${docbase}\n}\n\nstart_all_docbases() {\n   echo \"starting the repositories ...\"\n   DOCBASES=`ls -1 config 2&gt;\/dev\/null `\n   nb_items=0\n   for docbase in $DOCBASES; do\n      start_docbase $docbase\n      (( nb_items++ ))\n   done\n   echo \"$nb_items repositories started\"\n}\n\nstart_method_server() {\n   echo \"starting the method server ...\"\n   cd ${DOCUMENTUM}\/${JBOSS}\/server\n   nohup ${DOCUMENTUM}\/${JBOSS}\/server\/startMethodServer.sh 2&gt;&amp;1 &gt; \/tmp\/nohup.log &amp;\n   echo \"method server started\"\n}\n\nstart_all() {\n   echo \"starting all the documentum processes ...\"\n   start_all_docbrokers\n   start_all_docbases\n   start_method_server\n}\n\nstatus_docbroker() {\n   docbroker_name=$1\n   docbroker_host=$(grep \"^host=\" \/app\/dctm\/dba\/dm_launch_${docbroker_name} | cut -d= -f2)\n   docbroker_port=$(grep \"dmdocbroker -port \" \/app\/dctm\/dba\/dm_launch_${docbroker_name} | cut -d  -f3)\n   dmqdocbroker -t $docbroker_host -p $docbroker_port -c ping 2&gt; \/dev\/null 1&gt; \/dev\/null\n   local_status=$?\n   if [ $local_status -eq 0 ]; then\n      echo \"$(date +\"%Y\/%m\/%d %H:%M:%S\"): successfully pinged docbroker $docbroker_name listening on port $docbroker_port on host $docbroker_host\"\n   else\n      echo \"$(date +\"%Y\/%m\/%d %H:%M:%S\"): docbroker $docbroker_name listening on port $docbroker_port on host $docbroker_host is unhealthy\"\n      general_status=1\n   fi\n   echo \"status for docbroker $docbroker_name:$docbroker_port: $local_status, i.e. $(if [[ $local_status -eq 0 ]]; then echo OK; else echo NOK;fi)\"\n}\n\nstatus_all_docbrokers() {\n   DOCBROKERS=`ls -1 dm_launch_* 2&gt;\/dev\/null | cut -f3 -d_`\n   DOCBROKERS_PORTS=`grep -h \".\/dmdocbroker\" dm_launch_* | cut -f3 -d `\n   for f in `ls -1 dm_launch_* 2&gt;\/dev\/null `; do\n      docbroker_name=`echo $f | cut -f3 -d_`\n      docbroker_port=`grep \".\/dmdocbroker\" $f | cut -f3 -d `\n      status_docbroker $docbroker_name $docbroker_port\n   done\n   echo \"general status for all docbrokers: $general_status, i.e. $(if [[ $general_status -eq 0 ]]; then echo OK; else echo NOK;fi)\"\n}\n\nstatus_docbase() {\n   docbase=$1\n   timeout --preserve-status 30s idql $docbase -Udmadmin -Pxx 2&gt; \/dev\/null 1&gt; \/dev\/null &lt;&lt;eoq\n     quit\neoq\n   local_status=$?\n   if [[ $local_status -eq 0 ]]; then\n      echo \"$(date +\"%Y\/%m\/%d %H:%M:%S\"): successful connection to repository $docbase\"\n   else\n      echo \"$(date +\"%Y\/%m\/%d %H:%M:%S\"): repository $docbase is unhealthy\"\n      general_status=1\n   fi\n   echo \"status for docbase $docbase: $local_status, i.e. $(if [[ $local_status -eq 0 ]]; then echo OK; else echo NOK;fi)\"\n}\n\nstatus_all_docbases() {\n   DOCBASES=`ls -1 config 2&gt;\/dev\/null `\n   for docbase in $DOCBASES; do\n      status_docbase $docbase\n   done\n   echo \"general status for all docbases: $general_status, i.e. $(if [[ $general_status -eq 0 ]]; then echo OK; else echo NOK;fi)\"\n}\n\nstatus_method_server() {\n   # check the method server;\n   curl --silent --fail -k http:\/\/${HOSTNAME}:9080\/DmMethods\/servlet\/DoMethod 2&gt;&amp;1 &gt; \/dev\/null\n   local_status=$?\n   if [ $local_status -eq 0 ]; then\n      echo \"$(date +\"%Y\/%m\/%d %H:%M:%S\"): method server successfully contacted\"\n   else\n      echo \"$(date +\"%Y\/%m\/%d %H:%M:%S\"): method server is unhealthy\"\n      general_status=1\n   fi\n   echo \"status for method_server: $local_status, i.e. $(if [[ $local_status -eq 0 ]]; then echo OK; else echo NOK;fi)\"\n}\n\nstatus_all() {\n   status_all_docbrokers\n   status_all_docbases\n   status_method_server\n   echo \"General status: $general_status, i.e. $(if [[ $general_status -eq 0 ]]; then echo OK; else echo NOK;fi)\"\n}\n\nstop_docbase() {\n   echo \"stopping $docbase\"\n   docbase=$1\n   .\/dm_shutdown_${docbase}\n   echo \"docbase $docbase stopped\"\n}\n\nstop_all_docbases() {\n   echo \"stopping the repositories ...\"\n   DOCBASES=`ls -1 config 2&gt;\/dev\/null `\n   nb_items=0\n   for docbase in $DOCBASES; do\n      stop_docbase $docbase\n      (( nb_items++ ))\n   done\n   echo \"$nb_items repositories stopped\"\n}\n\nstop_docbroker() {\n   echo \"stopping docbroker $docbroker ...\"\n   docbroker=$1\n   .\/dm_stop_${docbroker}\n   echo \"docbroker $docbroker stopped\"\n}\n\nstop_all_docbrokers() {\n   echo \"stopping the docbrokers ...\"\n   DOCBROKERS=`ls -1 dm_stop_* 2&gt;\/dev\/null | cut -f3 -d_`\n   nb_items=0\n   for docbroker in $DOCBROKERS; do\n      stop_docbroker $docbroker\n      (( nb_items++ ))\n   done\n   echo \"$nb_items docbrokers stopped\"\n}\n\nstop_method_server() {\n   echo \"stopping the method server ...\"\n   ${DOCUMENTUM}\/${JBOSS}\/server\/stopMethodServer.sh\n   echo \"method server stopped\"\n}\n\nstop_all() {\n   echo \"stopping all the documentum processes ...\"\n   stop_all_docbases\n   stop_method_server\n   stop_all_docbrokers\n   echo \"all documentum processes stopped\"\n   ps -ajxf | egrep '(PPID|doc|java)' | grep -v grep | sort -n -k2,2\n}\n\n# -----------\n# main;\n# -----------\n   [[ -f ${DM_HOME}\/bin\/dm_set_server_env.sh ]] &amp;&amp; . ${DM_HOME}\/bin\/dm_set_server_env.sh\n   cd ${DOCUMENTUM}\/dba\n   if [[ $# -eq 0 ]]; then\n      Usage\n      exit 0\n   else\n      while [[ $# -ge 1 ]]; do\n         case $1 in\n\t    help)\n\t       Usage\n\t       exit 0\n\t    ;;\n            start|stop|status)\n\t       cmd=$1\n\t       shift\n\t       if [[ -z $1 || $1 = \"all\" ]]; then\n\t          ${cmd}_all\n\t       elif [[ $1 = \"docbases\" ]]; then\n\t          ${cmd}_all_docbases\n\t       elif [[ $1 = \"docbrokers\" ]]; then\n\t          ${cmd}_all_docbrokers\n\t       elif [[ ${1%%=*} = \"docbase\" ]]; then\n\t          docbases=`echo ${1##*=} | gawk '{gsub(\/,\/, \" \"); print}'`\n                  for docbase in $docbases; do\n\t             ${cmd}_docbase $docbase\n\t          done\n\t       elif [[ ${1%%=*} = \"docbroker\" ]]; then\n\t          docbrokers=`echo ${1##*=} | gawk '{gsub(\/,\/, \" \"); print}'`\n                  for docbroker in $docbrokers; do\n\t             ${cmd}_docbroker $docbroker\n\t          done\n\t       elif [[ $1 = \"method_server\" ]]; then\n                  ${cmd}_method_server\n               fi\n               exit $general_status\n            ;;\n            *)\n               echo \"syntax error\"\n\t       Usage\n\t       exit 1\n\t    ;;\n         esac\n         shift\n      done\n   fi\n<\/pre>\n<p>See lines 11 to 29 for its usage.<br \/>\nNote on line 110 the timeout command when attempting to connect to a docbase to check its status; see the article <a title=\"Adding a timeout in monitoring probes\" href=\"https:\/\/www.dbi-services.com\/blog\/adding-a-timeout-in-monitoring-probes\/\" target=\"_blank\" rel=\"noopener noreferrer\">Adding a timeout in monitoring probes<\/a> for an explanation.<br \/>\nWe couldn&#8217;t help but adding the option to address each component individually, or a few of them, in addition to all of them at once. So, the script lets us stop, start and inquire the status of one particular docbroker or docbase or method server, or a list of docbrokers or a list of docbases, or everything at once.<br \/>\nAfter a maintenance task, to stop all the Documentum processes, the command below could be used:<br \/>\n<code><br \/>\n$ start-stop.sh stop all<br \/>\n<\/code><br \/>\nSimilarly, to start everything:<br \/>\n<code><br \/>\n$ start-stop.sh start all<br \/>\n<\/code><br \/>\nThus, the proper order is guaranteed to be used and human error is prevented. By standardizing on such script and using it as shown, the aforementioned problem won&#8217;t occur anymore.<\/p>\n<p>That is fine but if we didn&#8217;t use the script and find ourselves in the situation where no docbroker is running and we must shut down the repositories, is there a way to do it easily and cleanly ? Well, easily, certainly, but cleanly, no. Please, continue reading on <a title=\"A Ruthless Repository Shutdown Utility, Part II\" href=\"https:\/\/www.dbi-services.com\/blog\/?p=36456&amp;preview=true\" target=\"_blank\" rel=\"noopener noreferrer\">Part II<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>You have finally completed that migration and need to restart all the Documentum processes. So, you shut down the docbroker and move on to the repositories but then you receive an error message about them not being reachable any more. Or conversely, you want to start all the Documentum processes and you start first the [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[525],"tags":[],"type_dbi":[],"class_list":["post-12772","post","type-post","status-publish","format-standard","hentry","category-enterprise-content-management"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>A Ruthless Repository Shutdown Utility, Part I - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Ruthless Repository Shutdown Utility, Part I\" \/>\n<meta property=\"og:description\" content=\"You have finally completed that migration and need to restart all the Documentum processes. So, you shut down the docbroker and move on to the repositories but then you receive an error message about them not being reachable any more. Or conversely, you want to start all the Documentum processes and you start first the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-18T18:16:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-24T07:32:10+00:00\" \/>\n<meta name=\"author\" content=\"Middleware Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Middleware Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"A Ruthless Repository Shutdown Utility, Part I\",\"datePublished\":\"2019-12-18T18:16:04+00:00\",\"dateModified\":\"2025-10-24T07:32:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/\"},\"wordCount\":789,\"commentCount\":0,\"articleSection\":[\"Enterprise content management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/\",\"name\":\"A Ruthless Repository Shutdown Utility, Part I - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2019-12-18T18:16:04+00:00\",\"dateModified\":\"2025-10-24T07:32:10+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Ruthless Repository Shutdown Utility, Part I\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\",\"name\":\"Middleware Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"caption\":\"Middleware Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A Ruthless Repository Shutdown Utility, Part I - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/","og_locale":"en_US","og_type":"article","og_title":"A Ruthless Repository Shutdown Utility, Part I","og_description":"You have finally completed that migration and need to restart all the Documentum processes. So, you shut down the docbroker and move on to the repositories but then you receive an error message about them not being reachable any more. Or conversely, you want to start all the Documentum processes and you start first the [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/","og_site_name":"dbi Blog","article_published_time":"2019-12-18T18:16:04+00:00","article_modified_time":"2025-10-24T07:32:10+00:00","author":"Middleware Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Middleware Team","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"A Ruthless Repository Shutdown Utility, Part I","datePublished":"2019-12-18T18:16:04+00:00","dateModified":"2025-10-24T07:32:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/"},"wordCount":789,"commentCount":0,"articleSection":["Enterprise content management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/","url":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/","name":"A Ruthless Repository Shutdown Utility, Part I - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2019-12-18T18:16:04+00:00","dateModified":"2025-10-24T07:32:10+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Ruthless Repository Shutdown Utility, Part I"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1","name":"Middleware Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","caption":"Middleware Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=12772"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12772\/revisions"}],"predecessor-version":[{"id":41181,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12772\/revisions\/41181"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=12772"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=12772"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=12772"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=12772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}