{"id":13197,"date":"2019-12-18T21:51:24","date_gmt":"2019-12-18T20:51:24","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/"},"modified":"2025-10-24T09:32:10","modified_gmt":"2025-10-24T07:32:10","slug":"a-ruthless-repository-shutdown-utility-part-ii","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/","title":{"rendered":"A Ruthless Repository Shutdown Utility, Part II"},"content":{"rendered":"<h2>Stopping the unreachable repositories<\/h2>\n<p>Suppose that the docbroker has been stopped prematurely and that we want to shut down the repositories but the out-of-the-box dm_shutdown_<em>repository<\/em> is not effective. Why is it so by the way ? If we look closely inside the shutdown script, we quickly notice the reason:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [10, 18,29,36]\">\n#!\/bin\/sh\n################## DOCUMENTUM SERVER SHUTDOWN FILE ######################\n#\n# 1994-2018 OpenText Corporation. All rights reserved\n# Version 16.4 of the Documentum Server.\n#\n# A generated server shutdown script for a repository.\n# This file was generated on Fri Aug 30 12:15:10 CEST 2019 by user dmadmin.\n#\ncheck_connect_status() {\nstatus=$1\nif [ ! $status = 0 ] ; then\n  cat &lt;&lt;-END\n  ***** $0: ERROR\n  ***** Unable to complete shutdown - unable to connect\n  ***** to the server to issue $2 request.\nEND\n  exit 1\nfi\n}\n...\n# Stop the server\necho Stopping Documentum server for repository: [dmtestgr02]\necho &#039;&#039;\nDM_DMADMIN_USER=dmadmin\n#\n# Get the pid for the root process\n#\nDM_PID=`.\/iapi dmtestgr02 -U$DM_DMADMIN_USER -P -e &lt;&lt; EOF  | grep &#039;root_pid&#039; | sed -e &#039;s\/ .*[: A-Za-z]\/\/&#039;\napply,s0,NULL,LIST_SESSIONS\nnext,s0,q0\ndump,s0,q0\nexit\nEOF`\nstatus=$?\ncheck_connect_status $status LIST_SESSIONS\n...\n            kill -9 $child_pid\n...\n  kill -9 $DM_PID\n...\n         kill -9 $child_pid\n...\n<\/pre>\n<p>On line 29, the shutdown script first attempts to connect to the repository in order to retrieve the root pid of the server processes. On line 36, this attempt&#8217;s result is checked by the function check_connect_status defined earlier in the script at line 10. If something went wrong during the connection, iapi&#8217;s return status will be != 0 and check_connect_status will simply exit the script on line 18. So, if a repository has gone berserk, or no free sessions are available, or the docbroker is unreachable, the script will not be able to stop it. That logic is quite restrictive and we must fall back to killing the repository&#8217;s processes ourselves anyway.<br \/>\nStrangely enough, the script is not scared of killing processes, it does this from several places, but it rather looks like it is a bit shy in identifying the right ones and therefore relies on the server itself or, ultimately, on the user, for help in this area.<br \/>\nAdmittedly, it is not always easy to pinpoint the right processes from the list returned by the command ps, especially if the repository is running in HA on the same machine, or if several repositories share the same machine, so extra care must be used in order not to kill the wrong ones. The dm_shutdown_<em>docbase<\/em> avoids this difficulty altogether by asking the content server (aka CS) its root pid and that is why it aborts if it cannot contact it.<br \/>\nHistorically, the &#8220;kill&#8221; command could only &#8220;kill -9&#8221; (SIGKILL, forceful, coercive kill) but nowadays it has been generalized to send signals and could just as well have been forked to &#8220;signal&#8221; or &#8220;send&#8221;. So, can a signal be sent to the main executable ${DM_HOME}\/bin\/documentum to ask it to cleanly shut down the repository ? We wish but this has not been implemented. Signals such as SIGQUIT, SIGTRAP, SIGINT and SIGABRT are trapped indeed but will only kill the server after printing to the server&#8217;s log the last executed SQL or the call stack trace, e.g. after a SIGINT was sent:<br \/>\n<code><br \/>\n2019-10-11T13:14:14.045467\t24429[24429]\t0100c35080004101\tError: dm_bear_trap: Unexpected exception, (SIGINT: interrupt: (2) at (Connection Failure)),  during new session creation in module dmapply.cxx after line 542.  Process exiting.<br \/>\n Last SQL statement executed by DB was:<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n Last SQL statement executed by DB was:<br \/>\n Last SQL statement executed by DB was:<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n Last SQL statement executed by DB was:<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n(23962) Outer Exception handler caught exception: SIGINT: interrupt: (2) at (RPC MAIN)<br \/>\n<\/code><br \/>\nThus, a corruption is theoretically possible while using any of those signals, just as it is when a SIGKILL signal is issued.<br \/>\nAccording to OTX Support, a trap handler that shuts down cleanly the repository has not been implemented because it needs a session to invoke the shutdown server method. OK, and what if a hidden session were opened at startup time and kept around just for such administrative cases ? How about a handler to immediately force a projection to the available docbrokers instead of waiting for the next checkpoint cycle ? As you see, there are ways to make the shutdown more resilient but my overall feeling is there is a lack of willingness to improve the content server.<br \/>\nTherefore, if waiting about 5 minutes for the repository to project to a docbroker is not acceptable, there is no other alternative than kill -9 the repository&#8217;s processes, start the docbroker(s) and then the repository. Other signals can work, but not always, and are not any safer.<br \/>\nIn order to use that command, one needs to know the content server&#8217;s root pid and since the CS does not accept any connection at this point, one must get it from another source. Once the root pid is available, it can be given to the kill command with a slight subtlety: in order to include its children processes, the root pid must be negated, e.g.:<br \/>\n<code><br \/>\n# use the standalone \/bin\/kill command;<br \/>\n$ \/bin\/kill --signal SIGKILL -12345<br \/>\n# or use bash's kill builtin:<br \/>\n$ command kill -s SIGKILL -12345<br \/>\n<\/code><br \/>\nThis will transitively kill the process with pid 12345 and all the others in same group, which are the ones it started itself, directly or indirectly.<br \/>\nIf a numeric signal is preferred, the equivalent command is:<br \/>\n<code><br \/>\n$ \/bin\/kill -9 -12345<br \/>\n<\/code><br \/>\nI leave it to you to decide which one is more readable.<br \/>\nSo now, we need to identify the repository&#8217;s root process. Once found, we can send its negated value the SIGKILL signal, which will propagate to all the child processes. Let&#8217;s see now how to identify this root process.<\/p>\n<h2>Identifying the content server&#8217;s root process<\/h2>\n<p>Ordinarily, the LIST_SESSIONS server method returns a collection containing the root_pid attribute among other valuable information, e.g.:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [12]\">\nAPI&gt; apply,c,NULL,LIST_SESSIONS\n...\nq0\nAPI&gt; next,c,q0\n...\nOK\nAPI&gt; dump,c,q0\n...\nUSER ATTRIBUTES\n&nbsp;\n  root_start                      : 12\/11\/2019 22:53:19\n  root_pid                        : 25329\n  shared_mem_id                   : 2588691\n  semaphore_id                    : 0\n  session                      [0]: 0100c3508000a11c\n                               [1]: 0100c3508000a102\n                               [2]: 0100c3508000a101\n  db_session_id                [0]: 272\n                               [1]: 37\n                               [2]: 33\n  typelockdb_session_id        [0]: -1\n                               [1]: -1\n                               [2]: -1\n  tempdb_session_ids           [0]: -1\n                               [1]: 45\n                               [2]: 36\n  pid                          [0]: 17686\n                               [1]: 26512\n                               [2]: 26465\n  user_name                    [0]: dmadmin\n                               [1]: dmadmin\n                               [2]: dmadmin\n  user_authentication          [0]: Trusted Client\n                               [1]: Password\n                               [2]: Trusted Client\n  client_host                  [0]: docker\n                               [1]: 172.19.0.3\n                               [2]: docker\n  client_lib_ver               [0]: 16.4.0070.0035\n                               [1]: 16.4.0070.0035\n                               [2]: 16.4.0070.0035\n...\n<\/pre>\n<p>But in our case, the CS is not reachable so it cannot be queried.<br \/>\nAn easy alternative is to simply look into the CS&#8217;s log:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [7]\">\ndmadmin@docker:\/app\/dctm$ less \/app\/dctm\/dba\/log\/dmtest.log\n&nbsp;\n    OpenText Documentum Content Server (version 16.4.0080.0129  Linux64.Oracle)\n    Copyright (c) 2018. OpenText Corporation\n    All rights reserved.\n&nbsp;\n2019-12-11T22:53:19.757264      25329[25329]    0000000000000000        [DM_SERVER_I_START_SERVER]info:  \"Docbase dmtest attempting to open\"\n&nbsp;\n2019-12-11T22:53:19.757358      25329[25329]    0000000000000000        [DM_SERVER_I_START_KEY_STORAGE_MODE]info:  \"Docbase dmtest is using database for cryptographic key storage\"\n...\n<\/pre>\n<p>The number 25329 is the root_pid. It can be extracted from the log file as shown below:<br \/>\n<code><br \/>\n$ grep \"[DM_SERVER_I_START_SERVER]info\" \/app\/dctm\/dba\/log\/dmtest.log | gawk '{if (match($2, \/[[0-9]+]\/)) {print substr($2, RSTART + 1, RLENGTH - 2); exit}}'<br \/>\n25329<br \/>\n# or compacter:<br \/>\ngawk '{if (match($0, \/[([0-9]+)].+[DM_SERVER_I_START_SERVER]info\/, root_pid)) {print root_pid[1]; exit}}' \/app\/dctm\/dba\/log\/dmtest.log<br \/>\n25329<br \/>\n<\/code><\/p>\n<p>The extracted root_pid can be confirmed by the ps command with options ajxf showing a nice tree-like view of the running processes. E.g.:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,3]\">\ndmadmin@docker:\/app\/dctm$ ps_gpid 25329\n PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND\n    1 25329 25329 25329 ?           -1 Ss    1001   0:01 .\/documentum -docbase_name dmtest -security acl -init_file \/app\/dctm\/dba\/config\/dmtest\/server.ini\n25329 25370 25329 25329 ?           -1 S     1001   0:00  _ \/app\/dctm\/product\/16.4\/bin\/mthdsvr master 0xe901fc83, 0x7f084db15000, 0x223000 50000  5 25329 dmtest \/app\/dctm\/dba\/log\n25370 25371 25329 25329 ?           -1 Sl    1001   0:05  |   _ \/app\/dctm\/product\/16.4\/bin\/mthdsvr worker 0xe901fc83, 0x7f084db15000, 0x223000 50000  5 0 dmtest \/app\/dctm\/dba\/log\n25370 25430 25329 25329 ?           -1 Sl    1001   0:05  |   _ \/app\/dctm\/product\/16.4\/bin\/mthdsvr worker 0xe901fc83, 0x7f084db15000, 0x223000 50000  5 1 dmtest \/app\/dctm\/dba\/log\n25370 25451 25329 25329 ?           -1 Sl    1001   0:05  |   _ \/app\/dctm\/product\/16.4\/bin\/mthdsvr worker 0xe901fc83, 0x7f084db15000, 0x223000 50000  5 2 dmtest \/app\/dctm\/dba\/log\n25370 25464 25329 25329 ?           -1 Sl    1001   0:05  |   _ \/app\/dctm\/product\/16.4\/bin\/mthdsvr worker 0xe901fc83, 0x7f084db15000, 0x223000 50000  5 3 dmtest \/app\/dctm\/dba\/log\n25370 25482 25329 25329 ?           -1 Sl    1001   0:05  |   _ \/app\/dctm\/product\/16.4\/bin\/mthdsvr worker 0xe901fc83, 0x7f084db15000, 0x223000 50000  5 4 dmtest \/app\/dctm\/dba\/log\n25329 25431 25329 25329 ?           -1 S     1001   0:00  _ .\/documentum -docbase_name dmtest -security acl -init_file \/app\/dctm\/dba\/config\/dmtest\/server.ini\n25329 25432 25329 25329 ?           -1 S     1001   0:00  _ .\/documentum -docbase_name dmtest -security acl -init_file \/app\/dctm\/dba\/config\/dmtest\/server.ini\n25329 25453 25329 25329 ?           -1 S     1001   0:00  _ .\/documentum -docbase_name dmtest -security acl -init_file \/app\/dctm\/dba\/config\/dmtest\/server.ini\n25329 25465 25329 25329 ?           -1 S     1001   0:00  _ .\/documentum -docbase_name dmtest -security acl -init_file \/app\/dctm\/dba\/config\/dmtest\/server.ini\n25329 25489 25329 25329 ?           -1 S     1001   0:00  _ .\/documentum -docbase_name dmtest -security acl -init_file \/app\/dctm\/dba\/config\/dmtest\/server.ini\n25329 26439 25329 25329 ?           -1 Sl    1001   0:11  _ .\/dm_agent_exec -docbase_name dmtest.dmtest -docbase_owner dmadmin -sleep_duration 0\n25329 26465 25329 25329 ?           -1 S     1001   0:00  _ .\/documentum -docbase_name dmtest -security acl -init_file \/app\/dctm\/dba\/config\/dmtest\/server.ini\n    1 10112 25329 25329 ?           -1 Rl    1001   0:03 .\/dm_agent_exec -docbase_name dmtest.dmtest -docbase_owner dmadmin -trace_level 0 -job_id 0800c3508000218b -log_directory \/app\/dctm\/dba\/log -docbase_id 50000\n<\/pre>\n<p>On line 3, the CS for docbase dmtest was started with pid 25329 and same value for its pgid. This process started then a few child processes all with the pgid 25329.<br \/>\nps_pgid on line 1 is a bash function defined in ~\/.bashrc as follows:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [3]\">\n# returns the lines from ps -ajxf with given gpid;\n# the ps command's header line is printed only if at least 1 entry is found;\nfunction ps_pgid {\n   pgid=$1\n   ps -ajxf | gawk -v pgid=$pgid 'BEGIN {getline; header = $0; h_not_printed = 1} {if ($3 == pgid) {if (h_not_printed) {print header; h_not_printed = 0}; print}}'\n}\n<\/pre>\n<p>The command does not show the method server nor the docbroker as they were started separately from the CS.<br \/>\nThus, if we execute the command below:<br \/>\n<code><br \/>\n$ kill --signal SIGKILL -25329<br \/>\n<\/code><br \/>\nthe CS will be killed along with all its child processes, which is exactly what we want.<\/p>\n<p>Putting both commands together, we get:<br \/>\n<code><br \/>\nkill --signal SIGKILL -$(grep \"[DM_SERVER_I_START_SERVER]info\" \/app\/dctm\/dba\/log\/dmtest.log | gawk '{if (match($2, \/[[0-9]+]\/)) {print substr($2, RSTART + 1, RLENGTH - 2); exit}}')<br \/>\n<\/code><br \/>\nIt may be worth defining a bash function for it too:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [10]\">\nfunction kill_cs {\n   repo=$1\n   kill --signal SIGKILL -$(grep \"[DM_SERVER_I_START_SERVER]info\" \/app\/dctm\/dba\/log\/${repo}.log | gawk '{if (match($2, \/[[0-9]+]\/)) {print substr($2, RSTART + 1, RLENGTH - 2); exit}}')\n}\n&nbsp;\n# source it:\n. ~\/.bashrc\n&nbsp;\n# call it:\nkill_cs dmtest\n<\/pre>\n<p>where test is the content server to kill.<br \/>\nThe naive way to search the running content server via the command &#8220;ps -ef | grep <em>docbase_name<\/em>&#8221; can be too ambiguous in case of multiple content servers for the same repository (e.g. in a high-availability installation) or when <em>docbase_name<\/em> is the stem of a family of docbases (e.g. dmtest_1, dmtest_2, &#8230;, dmtest_10, etc&#8230;). Besides, even if no ambiguity were possible, it would return too many processes to be killed individually. xargs could do it at once, sure, but why risk killing the wrong ones ? The above ps_pgid function is directly looking for the given group id which is the root_pid of the content server of interest taken straight out of its log file, no ambiguity here. <\/p>\n<h2>Hardening start-stop.sh<\/h2>\n<p>This ruthless kill functionality could be added to the start-stop script listed above, either as a command-line option to the stop parameter (say, like -k as in the dm_shutdown_<em>repository<\/em> script) or as a full parameter on a par with the stop | start | status ones, i.e.:<br \/>\n<code><br \/>\nstart-stop.sh stop | start | status | kill ...<br \/>\n<\/code><br \/>\nor, simply by deciding that a stop should always succeed and forcing a kill if needed. In such variant, the stop_docbase() function becomes:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [5,6,7,8]\">\nstop_docbase() {\n   echo \"stopping $docbase\"\n   docbase=$1\n   .\/dm_shutdown_${docbase}\n   if [[ $? -eq 1 ]]; then\n      echo \"killing docbase $docbase\"\n      kill_cs $docbase\n   fi\n   echo \"docbase $docbase stopped\"\n}\n<\/pre>\n<h2>Conclusion<\/h2>\n<p>If the content server were open source we wouldn&#8217;t have this article&#8217;s title. Instead, it would be &#8220;Forcing impromptu projections to docbrokers through signal handling in content server: an implementation&#8221; or &#8220;Shutting down a content server by sending a signal: a proposal&#8221;. We could send this request to the maintainers and probably receive a positive answer. Or we could implement the changes ourselves and submit them as a RFC. This model does not work so much in closed, commercial source which evolves following its own marketing agenda. Nonetheless, this situation gives us the opportunity to rant about it and find work-arounds. Imagine a world where all software were flawless, would it be as fun ?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Stopping the unreachable repositories Suppose that the docbroker has been stopped prematurely and that we want to shut down the repositories but the out-of-the-box dm_shutdown_repository is not effective. Why is it so by the way ? If we look closely inside the shutdown script, we quickly notice the reason: #!\/bin\/sh ################## DOCUMENTUM SERVER SHUTDOWN FILE [&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-13197","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.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>A Ruthless Repository Shutdown Utility, Part II - 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-part-ii\/\" \/>\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 II\" \/>\n<meta property=\"og:description\" content=\"Stopping the unreachable repositories Suppose that the docbroker has been stopped prematurely and that we want to shut down the repositories but the out-of-the-box dm_shutdown_repository is not effective. Why is it so by the way ? If we look closely inside the shutdown script, we quickly notice the reason: #!\/bin\/sh ################## DOCUMENTUM SERVER SHUTDOWN FILE [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-18T20:51:24+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=\"10 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-part-ii\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-ruthless-repository-shutdown-utility-part-ii\\\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"A Ruthless Repository Shutdown Utility, Part II\",\"datePublished\":\"2019-12-18T20:51:24+00:00\",\"dateModified\":\"2025-10-24T07:32:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-ruthless-repository-shutdown-utility-part-ii\\\/\"},\"wordCount\":1243,\"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-part-ii\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-ruthless-repository-shutdown-utility-part-ii\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-ruthless-repository-shutdown-utility-part-ii\\\/\",\"name\":\"A Ruthless Repository Shutdown Utility, Part II - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2019-12-18T20:51:24+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-part-ii\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-ruthless-repository-shutdown-utility-part-ii\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-ruthless-repository-shutdown-utility-part-ii\\\/#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 II\"}]},{\"@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 II - 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-part-ii\/","og_locale":"en_US","og_type":"article","og_title":"A Ruthless Repository Shutdown Utility, Part II","og_description":"Stopping the unreachable repositories Suppose that the docbroker has been stopped prematurely and that we want to shut down the repositories but the out-of-the-box dm_shutdown_repository is not effective. Why is it so by the way ? If we look closely inside the shutdown script, we quickly notice the reason: #!\/bin\/sh ################## DOCUMENTUM SERVER SHUTDOWN FILE [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/","og_site_name":"dbi Blog","article_published_time":"2019-12-18T20:51:24+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":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"A Ruthless Repository Shutdown Utility, Part II","datePublished":"2019-12-18T20:51:24+00:00","dateModified":"2025-10-24T07:32:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/"},"wordCount":1243,"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-part-ii\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/","url":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/","name":"A Ruthless Repository Shutdown Utility, Part II - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2019-12-18T20:51:24+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-part-ii\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/a-ruthless-repository-shutdown-utility-part-ii\/#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 II"}]},{"@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\/13197","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=13197"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13197\/revisions"}],"predecessor-version":[{"id":41180,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13197\/revisions\/41180"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=13197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=13197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=13197"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=13197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}