우분투에서 로그 아웃 / 재부트 / 종료시 스크립트 실행 사용하여 파일 을 실행하고

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



답변

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

다음 줄을 추가하십시오.

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적절한 시간에 시작해야합니다 .

출처 :


답변

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