우분투 시스템에서 init 스크립트를 업데이트하는 올바른 방법은 무엇입니까?
내 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) = ?
저는 Ubuntu보다 Cent에 더 익숙하며, 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
불행하게도 스크립트는 아직 실행되지 않습니다.
우분투 시스템에서 init 스크립트를 업그레이드하는 데 필요한 다른 것이 있습니까?
업데이트 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"으로 실행되어야 하는 것으로 보입니다.
답변1
Bash 또는 쉘 스크립트를 디버깅하려면 bash -x
이를 실행하거나 스크립트를 편집하고 한 줄을 추가하는 것이 유용합니다 set -x
. 그러면 변수에 할당된 값과 함께 스크립트가 실행될 때 스크립트의 각 줄의 실행 추적이 표시됩니다.
답변2
init 스크립트를 변경할 필요가 없는 문제에 대한 해결책을 찾았습니다.
gitlab의 지침은 사용자를 안내합니다 adduser --disabled-login
. 나는 puppet을 사용하여 사용자를 추가하지 않았고 adduser
기본 쉘을 /bin/bash 대신 /bin/false로 설정했습니다.
"git" 사용자의 쉘을 /bin/bash로 변경하면 init 스크립트가 다시 제대로 작동하기 시작했습니다.