컴퓨터가 종료되기 전에 간단한 명령을 실행하고 싶습니다(시간은 중요하지 않음).
시작을 위해 /etc/rc.local을 사용할 수 있습니다. 종료에도 비슷한 기능이 있습니까?
메뉴에 통합된 종료 버튼을 계속 사용하고 싶습니다. 즉, 터미널을 통해 종료할 때마다 사용자 정의 스크립트를 사용하고 싶지 않습니다. 자동으로 수행되어야 합니다.
답변1
Linux Mint는 Ubuntu를 기반으로 하고 있으므로 런레벨 시스템도 아마 동일할 것으로 추측됩니다. Ubuntu에서는 다양한 실행 수준의 스크립트가 디렉토리에 있는지 여부에 따라 실행됩니다 /etc/rc[0-6].d
.런레벨0은 종료에 해당하고 6은 다시 시작에 해당합니다.
일반적으로 스크립트 자체는 /etc/init.d
필요한 실행 수준에 해당하는 디렉터리에 저장된 다음 심볼릭 링크가 배치됩니다.
따라서 귀하의 경우에는 스크립트를 작성하고 저장한 /etc/init.d/
다음 각각 /etc/rc0.d
및 (둘 다 원하는 경우) /etc/rc6.d
스크립트에 대한 심볼릭 링크를 만듭니다 .
각 런레벨 디렉토리의 스크립트는 다음 위치에 있습니다.자연의 질서, 따라서 런레벨 내의 순서가 중요하다면 이에 따라 심볼릭 링크의 이름을 선택하십시오.
답변2
이제 Ubuntu 변형과 Mint가 systemd로 이동했으므로 위의 내용을 기반으로 한 이전 솔루션은 만족스럽지 않습니다. 나는 systemd를 사용하여 이를 달성하는 방법을 웹에서 검색했고 결국 다른 사람들의 지혜를 결합하여 블로그 게시물로 문서화했습니다.blogspot.com.au다음 튜토리얼이 포함되어 있습니다.
systemd를 사용하면 아래 템플릿을 사용하여 스크립트를 호출하는 파일 한두 개를 만들고 몇 가지 명령을 실행할 수 있습니다. 단순한.
그래픽 버전
첫 번째시작 및/또는 종료 시 실행할 스크립트를 만듭니다. .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
start.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 활성화 your_files_name 명령을 실행합니다(단, 접미사 서비스는 제외). 그래서 내 첫 번째는systemctl enable startup
서비스를 시작하려면 컴퓨터를 한 번 다시 시작하세요. systemd가 다중 사용자 대상에 들어갈 때마다 시작 서비스를 수행하고, 다중 사용자 대상에서 나갈 때 중지 서비스를 수행합니다. 활성화 조건이 다른 대체 서비스 파일은 아래에 설명되어 있습니다.
CLI(명령줄) 버전
이 설명에서는 귀하가 /home/john이 아닌 홈 디렉토리에서 작업하고, 적절하게 sudo를 사용하고, vim이나 svim을 작성할 편집기를 선택한다고 가정합니다.
만들다#!/bin/sh
첫 번째 줄 에는 시작 및 종료 셸 스크립트가 포함되어 있으며 chmod +x my_new_filename
.
만들다위와 같은 두 개의 파일(이 예에서는 하나의 파일)이 시작 및 종료 작업을 처리합니다. 내 홈 디렉터리에서 스크립트를 실행했지만 @don_crissti가 몇 가지 대안을 보여주었습니다.스택 교환.
vim /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_stop
이러한 명령을 systemctl is-active start_and_stop
사용하여 새 서비스를 모니터링할 수 있습니다.
종료 트리거 조건 변경
위의 파일은 모두 다중 사용자 환경의 열기 또는 닫기를 사용하여 스크립트 실행을 시작합니다. 다음 파일은 네 가지 잠재적 종료 프로세스의 시작 부분을 사용하여 스크립트를 시작합니다. Before 라인 + WantedBy 라인에서 대상을 추가하거나 제거하면 더 세밀하게 구분할 수 있습니다.
이 문서는 두 번째 답변에서 제안되었습니다이 기사의하지만 설치 부분을 추가하기 전까지는 실행할 수 없습니다.
스크립트를 다시 편집 /etc/systemd/service/
하고 를 사용하여 활성화합니다 systemctl enable your_file_name
. systemctl 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
답변3
rc.shutdown
Linux 커널의 종료 스크립트를 사용해야 합니다 . 인용하다OpenBSD 매뉴얼 페이지:
Reboot(8) 또는 Halt(8) 명령을 사용하여 시스템을 종료할 때, init(8)이 그렇게 하라는 신호를 받을 때, 또는 키보드 요청 중지가 실행될 때(아키텍처가 이를 지원하는 경우), rc (8) "shutdown" 매개변수를 사용하여 호출됩니다.
따라서 rc.shutdown을 열고 실행하려는 쉘 명령을 추가하기만 하면 됩니다.
업데이트: Linux Mint는 Ubuntu를 기반으로 하기 때문에 시작/종료 프로세스가 다르므로 귀하에게 관련된 프로세스는 다음과 같습니다.
실행하려는 쉘 스크립트를 작성하고 스크립트가 실행하려는 실행 레벨에 해당 /etc/rc*.d/
하는 . 에 복사하십시오. Ubuntu는 Debian 런레벨 번호 지정을 따르므로 런레벨 0은 중지하는 데 사용되고 런레벨 6은 다시 시작하는 데 사용됩니다.*
답변4
rc.shutdown
Debian Wheezy, Devuan 및 그 파생물, 기타 버전에서 사용되는 SysV 종속 초기화 시스템의 경우 rc.local
다음과 유사한 동작을 에뮬레이션할 수 있습니다.
다음 프레임에 명령을 추가하십시오 /etc/rc.shutdown
.
#!/bin/sh -e
#
# rc.shutdown
#
# <add your commands here, before exit 0>
exit 0
스크립트를 저장하고 파일을 실행 가능하게 만듭니다 chmod a+x /etc/rc.shutdown
.
/etc/init.d/rc.shutdown
그런 다음 다음 콘텐츠가 포함된 새 스크립트를 시스템에 추가합니다.
#! /bin/sh
### BEGIN INIT INFO
# Provides: rc.shutdown
# Required-Start:
# Required-Stop:
# X-Stop-After: umountroot
# Default-Start:
# Default-Stop: 0 6
# Short-Description: Run /etc/rc.shutdown if it exist
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh
. /lib/lsb/init-functions
do_stop() {
if [ -x /etc/rc.shutdown ]; then
[ "$VERBOSE" != no ] && log_begin_msg "Running local shutdown scripts (/etc/rc.shutdown)"
/etc/rc.shutdown
ES=$?
[ "$VERBOSE" != no ] && log_end_msg $ES
return $ES
fi
}
case "$1" in
start)
# No-op
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop|status)
do_stop
exit 0
;;
*)
echo "Usage: $0 start|stop" >&2
exit 3
;;
esac
또한 스크립트를 실행 가능하게 만듭니다.
/etc/rc[06].d에 심볼릭 링크를 만듭니다.
cd /etc/rc0.d ; ln -s ../init.d/rc.shutdown K01rc.shutdown
그리고
cd /etc/rc6.d ; ln -s ../init.d/rc.shutdown K01rc.shutdown
insserv
기호 링크를 수정하고 필요한 .dependent.boot, .dependent.start 및 .dependent.stop 파일을 만드는 데 사용됩니다 .
insserv -v
위의 모든 명령을 실행하려면 루트이거나 sudo를 사용해야 합니다.