우분투에서 로그 아웃 / 재부트 / 종료시 스크립트 실행


30

.sh로그 아웃 및 우분투 종료시 bash를 사용하여 파일 을 실행하고 싶습니다 . 웹을 위아래로 검색했으며 KDE 및 GNOME에 대한 수정 사항 만 발견했습니다. 스크립트는 간단합니다. "logoff / shutdown"파일에 코드 줄을 추가 할 수 있는지 아니면 다른 스크립트에서 참조해야하는지 알아야합니다.


1
/etc/rc0.d에서 /etc/init.d에, 그리고 /etc/rc6.d에서 실행 파일에 심볼릭 링크를 넣어
또 다른 사용자

2
systemd사람들이 맨 처음에 볼 수 있도록 업데이트 된 답변 수락 (을 사용 )을 고려 하십시오.
Jonathan Y.

답변:


18

로그 아웃시 스크립트를 실행하려면

다음 줄을 추가하십시오.

session-cleanup-script=/path/to/script

에서 /etc/lightdm/lightdm.conf파일.

이 변경 사항을 적용하려면 lightdm을 다시 시작해야합니다. 이를 위해서는 tty1에서 Ctrl+ Alt+를 사용 F1하여 사용자 이름과 비밀번호로 로그인 한 후 다음 명령을 실행하십시오 :

sudo service lightdm restart

참고 : 그래픽 세션으로 전환 하려면 Ctrl+ Alt+ F7를 사용하십시오.

재부팅시 스크립트를 실행하려면

  1. 당신의 스크립트를 넣어 /etc/rc0.d
  2. 실행 가능하게 만드십시오. sudo chmod +x K99_script
  3. 노트:
    • 이 디렉토리의 스크립트는 알파벳 순서로 실행됩니다.
    • 스크립트 이름은 K99적절한 시간에 시작해야합니다 .

종료시 스크립트를 실행하려면

  1. 당신의 스크립트를 넣어 /etc/rc6.d
  2. 실행 가능하게 만드십시오. sudo chmod +x K99_script
  3. 노트:
    • 이 디렉토리의 스크립트는 알파벳 순서로 실행됩니다.
    • 스크립트 이름은 K99적절한 시간에 시작해야합니다 .

출처 :


4
'Kill'과 'Start'로 시작하는 스크립트의 이름을 지정하는 것이 일반적 입니다. KS
kiri

스크립트에 sudo 권한이 필요한 경우 어떻게합니까? 내가 알 수있는 한 /etc/rc6.d 스크립트는 사용자로 실행되며 gksudo를 사용할 수 없습니다.
Urhixidur

1
14.04에서 작동하지 않습니다. 변경되거나 지정되지 않은 중요한 사실이 있습니까?
tomasb

2
K99 조언은 마운트 해제 후 발생하는 일부 데이터를 저장하고 K를 사용하여 스크립트를 비활성화하는 데 사용되며 (/etc/rcS.d/README 참조) 시작을 위해 S를 사용하여 마운트 해제하기 전에 종료 / 재부팅에 적합하지 않습니다. 부팅 장소 스크립트 마운트 후, 때문에 이것에 붙어있어 첫 글자로 S로 해결이 잘못된 정보,
tomasb

6
i) 스크립트 이름 K은 런레벨 0, 1 및 6과 S런레벨 2, 3, 4 및 5로 시작해야합니다. ii) 스크립트를 호출 할 필요 는 없습니다 K99_foo. 숫자는 스크립트 실행 순서를 결정합니다. 마지막으로 실행하려면 다른 스크립트보다 큰 것을 선택해야합니다. iii) 런레벨 0은 재부팅이 아닙니다! ; 종료 용입니다. 6은 재부팅을위한 것입니다. iv) 스크립트는 /etc/rcN.d디렉토리에 비즈니스가 없습니다 . 그들은 대신에해야 /etc/init.d하고 연결/etc/rcN.d.
terdon

14

systemd로하는 방법

2016 년 6 월 이후에이 스레드를 찾으면 Mint을 포함한 Ubuntu 및 파생 제품은 systemd를 사용하여 시스템 초기화 및 종료를 제어합니다. 나는 오래된 접근 방식에 문제가 있었으므로 체계적인 방법을 연구했습니다.

systemd를 사용하면 아래 템플릿을 사용하여 스크립트를 호출 할 하나 또는 두 개의 파일을 만들고 명령을 실행합니다. 단순한.


GUI 버전

먼저 시작 및 / 또는 종료시 실행할 스크립트를 작성하십시오. .scopening_atstart 및 .scfullcopy_atend를 만들었습니다.

그런 다음 파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하고 권한에서 파일을 프로그램으로 실행 허용을 선택했는지 확인하여 파일이 실행 가능한지 확인하십시오.

내가 만든 두 파일은 램 디스크의 내용을 채우고 저장합니다. 또한 서비스가 작동하고 있음을 증명하기 위해 내 홈 디렉토리에 파일을 만듭니다. 그들은 다음과 같은 형태였습니다.

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

그런 다음 파일 관리자를 루트로 열고 /etc/systemd/system, startup.service 및 save-ramdisk.service 파일을 열어서 만들었습니다. 분명히 자신의 이름을 선택할 수 있으며 일반 이름에는 johns_start.service라는 시작 파일과 johns_shutdown.service라는 종료 파일이 포함될 수 있습니다. 기존 서비스 이름을 선택하지 마십시오.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

동일한 서비스 파일을 사용하여 내 실행 스크립트의 전체 경로를 대체 할 수 있습니다.

마지막으로 으로 각각에 대해 systemctl enable your_files_name 명령을 실행하십시오 (그러나 접미사 서비스는 사용하지 않음). 첫 번째는systemctl enable startup

서비스를 시작하려면 컴퓨터를 한 번 재부팅하십시오. 시작 서비스는 systemd가 다중 사용자 대상에 진입 할 때마다 실행되고 다중 사용자 대상이 종료 될 때 중지 서비스가 실행됩니다. 활성화 조건이 다른 대체 서비스 파일이 아래에 설명됩니다.


CLI (명령 줄) 버전

이 설명에서는 / home / john이 아닌 홈 디렉토리에서 작업하고 필요에 따라 sudo를 사용하고 vim 또는 svim을 쓰는 편집기를 선택한다고 가정합니다.

첫 번째 줄로 시작 및 종료 쉘 스크립트 작성#!/bin/sh 하고를 사용하여 실행 가능하게하십시오 chmod +x my_new_filename.

작성 위와 같이 두 개의 파일을, 또는이 예에서는 하나 개의 파일 핸들 시작 및 종료 작업에. 내 홈 디렉토리에서 스크립트를 실행하지만 @don_crissti는 Stack Exchange에서 대안을 보여주었습니다.

svim /etc/systemd/system/start_and_stop.service

파일 내용을 복사하십시오.

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

그런 다음 다음 명령으로 서비스활성화하십시오 .

systemctl enable start_and_stop

서비스가 활성화 된 후 시스템을 재부팅하십시오. 명령 systemctl is-enabled start_and_stopsystemctl is-active start_and_stop사용하여 새 서비스를 모니터링 할 수 있습니다.


종료 트리거 조건 변경

위의 파일은 모두 다중 사용자 환경의 열기 또는 닫기를 사용하여 스크립트 실행을 시작합니다. 아래 파일은 네 가지 잠재적 종료 프로세스의 시작을 사용하여 스크립트를 시작합니다. Before 라인 + WantedBy 라인에서 대상을 추가 또는 제거하면보다 세부적으로 구별 할 수 있습니다.

이 파일은 @Matthias의 Unix & Linux 답변에서 제안되었지만 설치 섹션을 추가 할 때까지 실행할 수 없었습니다.

다시 스크립트를 편집하고을 /etc/systemd/service/사용하여 활성화하십시오 systemctl enable your_file_name. 대상을 변경하면 systemclt disable file_name명령을 사용한 다음 대상 디렉토리에 심볼릭 링크 된 명령을 다시 활성화했습니다. 재부팅하면 서비스가 작동합니다.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

1
게시물이 정확하지만 시스템에서 이러한 단계를 수행하는 방법에 대한 예를 추가하여 게시물을 개선하는 것이 좋습니다. 게시물을 수정하면 알려주십시오. AskUbuntu
Sergiy Kolodyazhnyy에

Serg, 링크 된 게시물과 같은 예를 의미합니까, 아니면 다른 것을 염두에 두셨습니까? 둘째, 다른 SO 사용자에게 연락하기위한 메커니즘을 찾을 수 없기 때문에 어떻게 "알고 있는지"잘 모르겠습니다.
John 9631

예, 다른 게시물과 동일한 예를 제공 할 수 있습니다. "다른 링크로 이동"이라고 말하는 것은 그리 좋지 않으며 답변이 게으르게 보입니다. 또한 다른 SO 사용자에게 연락하기 위해 @를 사용자 이름 앞에 사용하십시오 (예 : @Serg
Sergiy Kolodyazhnyy

많이 향상되었습니다. 잘, 좋은 일을 유지!
Sergiy Kolodyazhnyy

1
man systemd.unit사용자 생성 파일 에 따라 $XDG_CONFIG_HOME/systemd/user다른 로컬 사용자 위치에 배치 할 수 있습니다
Antonios Hadjigeorgalis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.