如何更新初始化腳本
更新 ubuntu 系統的初始化腳本的正確方法是什麼?
我正在嘗試將我的 gitlab 版本從 6-0 升級到 6-1,升級的一部分包括替換 init 腳本。
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
我發現更新初始化腳本後,呼叫腳本什麼都不做。通常它會列印出 gitlab 服務的程序 ID
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
我已採取的解決此問題的步驟:
確保它是可執行的
root@gitlab:/etc/init.d# ll gitlab -rwxr-xr-x 1 root root 7195 Sep 28 19:29 gitlab*
跟踪腳本
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) = ?
我對 Cent 比對 Ubuntu 更熟悉,我聽到關於手動執行 update-rc.d 的不同意見。根據這個部落格的建議,我已經嘗試過了
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
不走運,腳本仍然沒有執行。
在 ubuntu 系統上還有什麼必須做的事情來升級初始化腳本嗎?
更新1:
查看 /var/log/auth.log 顯示:
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
更新2
我已經對 6-0-stable 和 6-1-stable 之間的初始化腳本進行了比較。它似乎是一個幾乎完全的重寫。
差異位於此處:
https ://gist.github.com/spudstud/6747146#file-diff-gitlab-init-scripts
你可以在這裡看到實際的 6-0 腳本:
https ://github.com/gitlabhq/gitlabhq/blob/6-0-stable/lib/support/init.d/gitlab
和這裡的 6-1 腳本:
https://github.com/gitlabhq/gitlabhq/blob/6-1-stable/lib/support/init.d/gitlab
更新3
嘗試使用 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
成功,
看來該腳本必須以使用者“git”的身份執行。
要調試 bash 或 shell 腳本,執行它
bash -x
或編輯腳本並添加一行set -x
. 這將顯示腳本中每一行在執行時的執行跟踪,以及變數賦值的值。
我發現了不需要更改初始化腳本的問題的解決方案。
gitlab 的說明指導使用者使用
adduser --disabled-login
. 我沒有使用adduser
puppet 添加使用者並將預設 shell 設置為 /bin/false 而不是 /bin/bash。一旦我將 ‘git’ 使用者的 shell 更改為 /bin/bash,init 腳本就會再次開始正常工作。