3

What is the proper way to update an init script an ubuntu system?

I am trying to upgrade my version of gitlab from 6-0 to 6-1, part of the upgrade consists of replacing the init script.

Upgrade instructions - step 6

sudo rm /etc/init.d/gitlab
sudo curl --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlabhq/6-1-stable/lib/support/init.d/gitlab
sudo chmod +x /etc/init.d/gitlab

I find that after updating the init script, calling script does nothing. Normally it prints out the processes id of the gitlab service

root@gitlab:/etc/init.d# /etc/init.d/gitlab status
root@gitlab:/etc/init.d# (notice how nothing happens)

#No gitlab process is running
root@gitlab:/etc/init.d# ps aux |grep gitlab
root      4519  0.0  0.1   9384   928 pts/0    R+   20:03   0:00 grep --color=auto gitlab

Steps I have taken to troubleshoot this:

Make sure it is executable

root@gitlab:/etc/init.d# ll gitlab
-rwxr-xr-x 1 root root 7195 Sep 28 19:29 gitlab*

Strace the script

    root@gitlab:/etc/init.d# strace ./gitlab
execve("./gitlab", ["./gitlab"], [/* 16 vars */]) = 0
brk(0)                                  = 0xb29000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd33a1a8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=22291, ...}) = 0
mmap(NULL, 22291, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd33a1a2000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\30\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1811128, ...}) = 0
mmap(NULL, 3925208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fd339bc9000
mprotect(0x7fd339d7e000, 2093056, PROT_NONE) = 0
mmap(0x7fd339f7d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b4000) = 0x7fd339f7d000
mmap(0x7fd339f83000, 17624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fd339f83000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd33a1a1000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd33a1a0000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd33a19f000
arch_prctl(ARCH_SET_FS, 0x7fd33a1a0700) = 0
mprotect(0x7fd339f7d000, 16384, PROT_READ) = 0
mprotect(0x619000, 4096, PROT_READ)     = 0
mprotect(0x7fd33a1aa000, 4096, PROT_READ) = 0
munmap(0x7fd33a1a2000, 22291)           = 0
getpid()                                = 4459
rt_sigaction(SIGCHLD, {0x40f100, ~[RTMIN RT_1], SA_RESTORER, 0x7fd339bff4a0}, NULL, 8) = 0
geteuid()                               = 0
brk(0)                                  = 0xb29000
brk(0xb4a000)                           = 0xb4a000
getppid()                               = 4458
stat("/etc/init.d", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("./gitlab", O_RDONLY)              = 3
fcntl(3, F_DUPFD, 10)                   = 10
close(3)                                = 0
fcntl(10, F_SETFD, FD_CLOEXEC)          = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {0x40f100, ~[RTMIN RT_1], SA_RESTORER, 0x7fd339bff4a0}, NULL, 8) = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, ~[RTMIN RT_1], SA_RESTORER, 0x7fd339bff4a0}, NULL, 8) = 0
rt_sigaction(SIGTERM, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTERM, {SIG_DFL, ~[RTMIN RT_1], SA_RESTORER, 0x7fd339bff4a0}, NULL, 8) = 0
read(10, "#! /bin/sh\n\n# GITLAB\n# Maintaine"..., 8192) = 7195
stat("/usr/local/sbin/sudo", 0x7fffcbf518d0) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/sudo", 0x7fffcbf518d0) = -1 ENOENT (No such file or directory)
stat("/usr/sbin/sudo", 0x7fffcbf518d0)  = -1 ENOENT (No such file or directory)
stat("/usr/bin/sudo", {st_mode=S_IFREG|S_ISUID|0755, st_size=71288, ...}) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd33a1a09d0) = 4460
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 4460
--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigreturn(0x11)                      = 4460
exit_group(1)                           = ?

I am more familiar with Cent than Ubuntu, and I hear mixed opinions on manually executing update-rc.d. I've tried it anyway per the suggestion of this blog

root@gitlab:/etc/init.d# sudo update-rc.d -f gitlab remove
 Removing any system startup links for /etc/init.d/gitlab ...
   /etc/rc0.d/K20gitlab
   /etc/rc1.d/K20gitlab
   /etc/rc2.d/S20gitlab
   /etc/rc3.d/S20gitlab
   /etc/rc4.d/S20gitlab
   /etc/rc5.d/S20gitlab
   /etc/rc6.d/K20gitlab
root@gitlab:/etc/init.d# update-rc.d gitlab defaults
 Adding system startup for /etc/init.d/gitlab ...
   /etc/rc0.d/K20gitlab -> ../init.d/gitlab
   /etc/rc1.d/K20gitlab -> ../init.d/gitlab
   /etc/rc6.d/K20gitlab -> ../init.d/gitlab
   /etc/rc2.d/S20gitlab -> ../init.d/gitlab
   /etc/rc3.d/S20gitlab -> ../init.d/gitlab
   /etc/rc4.d/S20gitlab -> ../init.d/gitlab
   /etc/rc5.d/S20gitlab -> ../init.d/gitlab

No luck, the script still doesn't run.

Is there anything else that must be done on ubuntu systems to upgrade init scripts?


Update1:

Looking at /var/log/auth.log shows:

vagrant@gitlab:~$ sudo su -
root@gitlab:~# /etc/init.d/gitlab status
root@gitlab:~# tail /var/log/auth.log
Sep 28 20:52:31 gitlab su[2205]: pam_unix(su:session): session closed for user root
Sep 28 20:52:31 gitlab sudo: pam_unix(sudo:session): session closed for user root
Sep 28 20:52:34 gitlab sudo:  vagrant : TTY=pts/0 ; PWD=/home/vagrant ; USER=root ; COMMAND=/bin/su -
Sep 28 20:52:34 gitlab sudo: pam_unix(sudo:session): session opened for user root by vagrant(uid=1000)
Sep 28 20:52:34 gitlab su[2311]: Successful su for root by root
Sep 28 20:52:34 gitlab su[2311]: + /dev/pts/0 root:root
Sep 28 20:52:34 gitlab su[2311]: pam_unix(su:session): session opened for user root by vagrant(uid=0)
Sep 28 20:52:43 gitlab sudo:     root : TTY=pts/0 ; PWD=/root ; USER=git ; COMMAND=/bin/false -c /etc/init.d/gitlab status
Sep 28 20:52:43 gitlab sudo: pam_unix(sudo:session): session opened for user git by vagrant(uid=0)
Sep 28 20:52:43 gitlab sudo: pam_unix(sudo:session): session closed for user git

Update2

I've done a diff of the init scripts between 6-0-stable and 6-1-stable. It appears to have been an almost complete rewrite.

The diff is located here:
https://gist.github.com/spudstud/6747146#file-diff-gitlab-init-scripts

You can see the actual 6-0 script here:
https://github.com/gitlabhq/gitlabhq/blob/6-0-stable/lib/support/init.d/gitlab

and the 6-1 script here:

https://github.com/gitlabhq/gitlabhq/blob/6-1-stable/lib/support/init.d/gitlab

Update3

Tried starting script using bash -x

root@gitlab:/etc/init.d# bash -x /etc/init.d/gitlab start
+ RAILS_ENV=production
+ app_root=/home/git/gitlab
+ app_user=git
+ unicorn_conf=/home/git/gitlab/config/unicorn.rb
+ pid_path=/home/git/gitlab/tmp/pids
+ socket_path=/home/git/gitlab/tmp/sockets
+ web_server_pid_path=/home/git/gitlab/tmp/pids/unicorn.pid
+ sidekiq_pid_path=/home/git/gitlab/tmp/pids/sidekiq.pid
+ '[' root '!=' git ']'
+ sudo -u git -H -i /etc/init.d/gitlab start
+ exit

Success,

It appears that the script must be run as the user 'git'.

  • Anything useful in /var/log/auth.log? – dawud Sep 28 '13 at 20:37
  • Thanks for the idea, I've added it to the question. Nothing jumps out at me. – spuder Sep 28 '13 at 20:54
  • Do you by chance still have the previous init script around, so as to run a diff -ub against the current one? – dawud Sep 28 '13 at 21:10
  • @dawud , Yes I do have both scripts and I ran a diff -ub. (see update2 in the question). It looks like there were a lot of changes. – spuder Sep 28 '13 at 22:03
  • 3
    what makes you think that the problem is due to replacing an init.d script rather than just bugs in the new version of the script? btw, stracing a shell script isn't usually very useful - try running it with bash -x instead. e.g. bash -x /etc/init.d/gitlab start – cas Sep 29 '13 at 1:36
2

To debug bash or shell scripts, it's useful to either run it with bash -x or edit the script and add a line saying set -x. This will show the execution trace of each line in the script as it is executed, along with the value of variable assignments.

|improve this answer|||||
0

I discovered the solution to the problem which does not require changing the init script.

The instructions for gitlab instruct the user to use adduser --disabled-login. Instead of using adduser I used puppet to add the user and set the default shell to /bin/false instead of /bin/bash.

As soon as I changed my 'git' user's shell to /bin/bash, the init script started working correctly again.

|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.