Ich versuche, die Aktualisierung des Versionskontroll-Repositorys in crontab zu automatisieren. Das folgende Skript /home/usr/mrbean/bin/update.sh
funktioniert in der interaktiven Bash-Befehlszeile:
#!/bin/bash
ROOTPATH="/home/user/mrbean/temp/"
cd $ROOTPATH
SSHTMPFILE="${ROOTPATH}ssh-agent.cf"
ssh-agent -s | head -n 2 > "$SSHTMPFILE"
function killsshagent {
/bin/kill $SSH_AGENT_PID
}
trap killsshagent EXIT
if [ -f "$SSHTMPFILE" ]; then
source "$SSHTMPFILE"
ssh-add
rm "$SSHTMPFILE"
fi
killsshagent
if [ `hostname` == "mrbeancomp.local" ]; then
REPODIR="/home/usr/mrbean/repo/"
cd $REPODIR
cvs update -dP > "$HOME/log/log.txt"
fi
Ich füge dann hinzu
@hourly /home/usr/mrbean/bin/update.sh
Das Skript funktioniert von selbst, wenn es in einer interaktiven Bash-Shell aufgerufen wird, aber nicht über Crontab. Es gibt Fehler aus und sendet eine Systemmail /var/mail/mrbean
:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
cvs [update aborted]: end of file from server (consult above messages if any)
[Aktualisieren]
killsshagent
zum Programm hinzugefügt, sodass ssh-agent
es nicht hängen bleibt.
[Aktualisieren]
Habe ein angepasstes Programm in einem Git-Repository ausprobiert und dasselbe Problem festgestellt. Mr. Bean darf dieses CVS-Repository nicht sofort aufgeben und zu einem neuen Git-Repository wechseln.
[Aktualisieren]
Ich habe mehrere Identitätsdateien in $HOME/.ssh/
. Ist es möglich, dass ich beim Ausführen von crontab angeben muss, welche Identitätsdatei verwendet werden soll? Wenn ja, wie?
Antwort1
Eine Vermutung (ich bin kein Unix-Experte, hatte aber ein ähnliches Problem mit nicht ausgeführten Cron-Jobs): Als welcher Benutzer führen Sie die Aufgabe aus? Verfügt dieser Benutzer über alle erforderlichen Berechtigungen, um auf alles zuzugreifen, was Sie benötigen?
Ich vermute nicht (der Fehler sagt das irgendwie! :-D).
Wenn Sie sich vom Arbeitsbenutzer abmelden und als anderer Benutzer anmelden, funktioniert das Bash-Skript dann immer noch? Wenn nicht, hilft das schon irgendwie.
Die von uns verwendete Lösung bestand darin, die Aufgabe als bestimmter Benutzer auszuführen.
Es scheint, dass es mehrere Möglichkeiten gibt, dies zu tun (gibt es die nicht immer). Ich kann nicht beurteilen, welche der beiden Möglichkeiten besser ist als die anderen – das müssen Sie selbst entscheiden. Wie gibt man in der Crontab an, von welchem Benutzer das Skript ausgeführt werden soll?